NSData类别中可能存在内存泄漏

时间:2011-12-22 11:33:48

标签: objective-c ios xcode memory-management autorelease

使用XCode分析仪时,我收到一条消息:

  

分配对象的潜在泄漏

此代码位于我的NSData(String)类别中,代码为:

- (NSString*) utf8String
{
    return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding];
}

现在我该如何解决这个问题?当我将语句更改为:

- (NSString*) utf8String
{
    return [[[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding] autorelease];
}

我的应用程序在我调用utf8String的行上崩溃。

2 个答案:

答案 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内存管理的详细信息。