2011-12-22 71 views
1

当使用Xcode分析我得到一个消息说:潜在的内存泄漏

对象的潜在泄漏分配

的代码,这是在我的NSData(String)类,代码:

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

现在我该如何解决这个问题?当我改变了声明:在这里我呼吁utf8String

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

我的应用程序崩溃。

回答

2

我想你的应用程序崩溃是因为变量在使用之前被释放。如果您不立即使用返回值,而是将其存储在成员变量中,则建议调用retain

... 
myMemberVariable = [something utf8String]; 
[myMemberVariable retain]; 
... 

为了确保您不会产生内存泄漏,您必须在某处释放成员变量。一个好的地方是dealloc

- (void)dealloc { 
    if (myMemberVariable) [myMemberVariable release]; 

    [super dealloc]; 
} 

我也推荐看看Advanced Memory Management Programming Guide来获得关于iOS内存管理的一些详细信息。

3

可可命名约定表明所有方法都返回自动释放对象,但名称以'init','copy'或'new'开头的方法除外。静态分析器知道并检查它。

你有两种选择。您可以将该方法重命名为-newUTF8String,或者您可以返回一个autorelease对象,并在要存储此方法的返回值时保留它。

我宁愿后者,但都将是有效的代码。