【问题标题】:Is release needed for a reference turned from retain on autorelease object?从自动释放对象上的保留转向引用是否需要释放?
【发布时间】:2011-12-09 17:01:16
【问题描述】:
对于以下代码,从 getFoo 返回的对象需要保留 1; 2 - 方法 func 中的 foo 是否需要释放?
- (NSString *)getFoo {
return [[[NSString alloc] initWithString:@"foo"] autorelease];
}
- (void)func {
// ??? is the retain needed?
NSString *foo = [[self getFoo] retain];
// use foo
// ??? is the release needed?
[foo release];
}
【问题讨论】:
标签:
objective-c
release
retain
autorelease
【解决方案1】:
每个retain 必须与release 匹配。
这就是说,在你的函数中,如果你不延迟它的使用,你不需要retain *foo。
通常自动释放池会在运行循环结束时获得drain,因此您有时间在函数中本地使用它。
但是如果你retain你必须release。
你可以这样做:
return [NSString stringWithString:@"foo];
这是一个方便的方法,它返回一个autorelease 对象给你。
【解决方案2】:
如果你 alloc、copy 或 retain 一个对象,你需要 release 它。
在您的示例中,您不需要保留它。但既然你这样做了,你确实需要释放它。
【解决方案3】:
您编写的代码很好。
当您分配字符串时,它的保留计数为 1。
然后您自动释放字符串,这将在以后减少保留计数。
你使用 foo.
那么你就不需要释放它了,因为你已经自动释放了它:它会在以后自动释放。
请注意,您可以使用 stringWithFormat 或 stringWithString 创建一个已经自动释放的字符串。
这样会更整洁一些。