我正在使用NSMutable String从数据库查询中获取字符串。我已使用@“”分配变量,然后填充,如果从数据库中找到。我已经尝试添加autorelease / release但这会导致引用数据库调用的问题。
有人可以指出我的错误吗?
我会输入这段代码,但我觉得分析器箭头很有用。
答案 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语句中,因此它不会意外地过度发布原始值@""
。 (因为不应释放常量字符串。)