使用XCode分析仪时,我收到一条消息:
分配对象的潜在泄漏
此代码位于我的NSData(String)
类别中,代码为:
- (NSString*) utf8String
{
return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding];
}
现在我该如何解决这个问题?当我将语句更改为:
时- (NSString*) utf8String
{
return [[[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding] autorelease];
}
我的应用程序在我调用utf8String
的行上崩溃。
答案 0 :(得分:3)
可可命名约定表明所有方法都返回自动释放的对象,但名称以“init”,“copy”或“new”开头的方法除外。静态分析器知道并检查它。
你有两个选择。您可以将方法重命名为-newUTF8String,也可以返回自动释放对象,并在想要存储此方法的返回值时保留它。
我更喜欢后者,但两者都是有效的代码。
答案 1 :(得分:2)
我猜您的应用程序崩溃是因为变量在使用之前已经释放。如果您不立即使用返回值,则建议调用retain
,但将其存储在成员变量中。
...
myMemberVariable = [something utf8String];
[myMemberVariable retain];
...
为了确保不会产生内存泄漏,您必须在某处释放成员变量。一个好的地方是dealloc
。
- (void)dealloc {
if (myMemberVariable) [myMemberVariable release];
[super dealloc];
}
我还建议您查看Advanced Memory Management Programming Guide以获取有关iOS内存管理的详细信息。