Objective-C 返回 NSString 时内存泄漏

Objective-C memory leak when returning NSString

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

首先调用 [reader readString]。

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

readString 是 returns 自动释放的字符串。

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

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

我无法将我的代码更改为 ARC。普通的旧式非 ARC 内存管理。

你发的没问题。此时唯一的规则是方法包含 "create" 或 "alloc" 将 return 需要显式释放的对象。在您的情况下,这是 readString 方法中的字符串 returned。

由于对象将被 returned 你需要保留它直到自动释放池将执行的 运行 循环结束。例如,这意味着如果将在 for 循环中调用此方法,则在循环退出之前不会释放对象。

如果你想或需要避免这种情况,我建议你对 "create" 或 "alloc" 和 return 一个未自动释放的对象执行相同的模式:

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;
}