我想确保我的代码没有泄漏,因为这个小代码段在我的应用中被调用了数千次。我通过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内存管理。
答案 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;
}