Obj-C,内存泄漏混乱

时间:2011-08-13 09:45:45

标签: iphone objective-c xcode cocoa-touch

我正在使用NSMutable String从数据库查询中获取字符串。我已使用@“”分配变量,然后填充,如果从数据库中找到。我已经尝试添加autorelease / release但这会导致引用数据库调用的问题。

有人可以指出我的错误吗?

我会输入这段代码,但我觉得分析器箭头很有用。

enter image description here

2 个答案:

答案 0 :(得分:2)

您正在创建一个自动释放的NSMutableString,并指定指针strDBAAppVer指向它。但是你抛弃对该对象的引用,并获得指针strDBAppVer指向一个新对象,一个保留计数为1的NSString。

我想要你想要的是if语句中的内容是这样的:

NSString* databaseField = [[NSString alloc] initWithUTF ...etc.]
[strDBAppVer setString: databaseField];
[databaseField release];

答案 1 :(得分:1)

strDBAppVer首先设置为[NSMutableString stringWithString:@""],这在记忆方面是合理的。但是,稍后,您完全将变量重新设置为由alloc / initWithUTF8String:创建的整个不同对象,使strDBAppVer 有时指向已经自动释放的对象,有时(当if语句为真时)指向保留计数为+1的对象。

这就是泄漏但释放导致问题的原因。如果if语句为true,则您将变量设置为指向+1计数的对象,如果为false,则将变量设置为指向完全不同的 0计数的对象。

这让我觉得对可变字符串的混淆。您是否意识到,至少在发布的代码中,您实际上并未改变strDBAppVer?试试这个:

NSString* strDBAppVer = @"";

然后,在你的if语句中,

strDBAppVer = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statementAppVer,0)];
//Now, realizing that strDBAppVer has just been reassigned to point
//to an entirely new object, one created with alloc/init, and therefore one that
//needs to be released,
[strDBAppVer autorelease];

请注意,自动释放仅在if语句中,因此它不会意外地过度发布原始值@""。 (因为不应释放常量字符串。)