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;
}
我想确保我的代码没有泄漏,因为这个小片段在我的应用程序中被调用了数千次。我 运行 通过 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;
}