返回NSString时,Objective-C内存泄漏

时间:2015-05-21 10:45:12

标签: ios objective-c iphone memory-management memory-leaks

我想确保我的代码没有泄漏,因为这个小代码段在我的应用中被调用了数千次。我通过Instruments运行应用程序,initWithBytes似乎有问题。这段代码有什么不对吗?

首先调用[reader readString]。

case FirstCase:
{       
    NSString *string = [reader readString];
    [self setPropertyByName:propertyName value:string];
    break;
}
...

readString返回自动释放的字符串。

- (NSString*) readString
 {
       ...
       NSString *string = [[[[NSString alloc] initWithBytes:cursor length:stringLength encoding:NSUTF8StringEncoding] autorelease];         
      return string;
}

代码好吗?还有其他更好的方法可以避免自动释放吗?

我无法将代码更改为ARC。简单的旧的非ARC内存管理。

1 个答案:

答案 0 :(得分:1)

你发布的内容没问题。此时唯一的规则是方法包含"创建"或"分配"将返回需要显式释放的对象。在您的情况下,这是readString方法中返回的字符串。

由于将返回该对象,因此您需要将其保留到自动释放池将执行的运行循环周期结束。例如,这意味着如果在for循环中调用此方法,则在循环退出之前不会释放对象。

如果您想要或需要避免这种情况,我建议您使用&#34创建相同的模式;创建"或"分配"并返回一个未自动释放的对象:

case FirstCase:
{       
    NSString *string = [reader createReadString];
    [self setPropertyByName:propertyName value:string];
    [string release];
    break;
}
...


- (NSString*) createReadString
{
       ...
       NSString *string = [[[NSString alloc] initWithBytes:cursor length:stringLength encoding:NSUTF8StringEncoding];         
      return string;
}