【问题标题】:memory leak with alloc内存泄漏与分配
【发布时间】:2010-07-30 07:32:04
【问题描述】:

我有以下导致内存泄漏的代码

-(NSString *) getSingRecord: (NSString *) getStatement{

NSString *sql=getStatement;

sqlite3_stmt *statement;

NSString *fieldFlagI=@"0";

if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
    while (sqlite3_step(statement) == SQLITE_ROW) {
        char *fieldFlag=(char *) sqlite3_column_text(statement, 0);
        fieldFlagI=[[NSString alloc] initWithUTF8String:fieldFlag];
        //fieldFlagI=[NSString initWithUTF8String:fieldFlag];
    }
    sqlite3_finalize(statement);
}
//NSString *ffI=fieldFlagI;
//[fieldFlagI release]
return [fieldFlagI];
}

检查苹果文档后,我将代码更改为返回 [fieldFlagI autorelease];

在我调用这个函数的代码段中

NSString *getRecord=[dbase getSingRecord:flag];

如果我执行 [getRecord release]; - 应用程序崩溃 - 我如何释放这个对象?

【问题讨论】:

    标签: iphone objective-c cocoa-touch memory-management


    【解决方案1】:

    如果您执行 [fieldFlagI autorelease];那么变量 'getRecord' 不拥有该对象,因此您无法释放。

    一旦您将对象添加到自动释放池中,您将无法释放该对象,直到您通过添加保留计数来拥有该对象。

    NSString *getRecord=[dbase getSingRecord:flag]; //object is in autorelease pool which will be released by pool
    [getRecord retain] //own the object
    //do some operation
    [getRecord release] //then release
    

    【讨论】:

      【解决方案2】:

      AutoreleasefieldFlagI 方法中的变量,retaingetRecord 结果获取它的所有权,以便您以后可以释放它。通读Memory Management Guide for iOS

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        • 2019-08-12
        • 1970-01-01
        • 2016-12-11
        • 2013-10-16
        • 2010-12-21
        • 1970-01-01
        相关资源
        最近更新 更多