从自动释放对象上的保留转向引用是不是需要释放?

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】:

如果你 alloccopyretain 一个对象,你需要 release 它。

在您的示例中,您不需要保留它。但既然你这样做了,你确实需要释放它。

【讨论】:

【参考方案3】:

您编写的代码很好。 当您分配字符串时,它的保留计数为 1。 然后您自动释放字符串,这将在以后减少保留计数。 你使用 foo. 那么你就不需要释放它了,因为你已经自动释放了它:它会在以后自动释放。

请注意,您可以使用 stringWithFormat 或 stringWithString 创建一个已经自动释放的字符串。

这样会更整洁一些。

【讨论】:

以上是关于从自动释放对象上的保留转向引用是不是需要释放?的主要内容,如果未能解决你的问题,请参考以下文章

@property(保留)是不是自动释放或释放对象?

第34条:以“自动释放池块”降低内存峰值

安全的 NSArray 访问

目标 C:线程之间的自动释放对象?

从 NSArray objectAtIndex 返回的 NSString 是自动释放还是保留

使用点语法设置保留属性时使用自动释放?