从自动释放对象上的保留转向引用是不是需要释放?
Posted
技术标签:
【中文标题】从自动释放对象上的保留转向引用是不是需要释放?【英文标题】: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];
【问题讨论】:
【参考方案1】:每个retain
必须与release
匹配。
这就是说,在你的函数中,如果你不延迟它的使用,你不需要retain
*foo。
通常自动释放池会在运行循环结束时获得drain
,因此您有时间在函数中本地使用它。
但是如果你retain
你必须release
。
你可以这样做:
return [NSString stringWithString:@"foo];
这是一个方便的方法,它返回一个autorelease
对象给你。
【讨论】:
【参考方案2】:如果你 alloc
、copy
或 retain
一个对象,你需要 release
它。
在您的示例中,您不需要保留它。但既然你这样做了,你确实需要释放它。
【讨论】:
【参考方案3】:您编写的代码很好。 当您分配字符串时,它的保留计数为 1。 然后您自动释放字符串,这将在以后减少保留计数。 你使用 foo. 那么你就不需要释放它了,因为你已经自动释放了它:它会在以后自动释放。
请注意,您可以使用 stringWithFormat 或 stringWithString 创建一个已经自动释放的字符串。
这样会更整洁一些。
【讨论】:
以上是关于从自动释放对象上的保留转向引用是不是需要释放?的主要内容,如果未能解决你的问题,请参考以下文章