是否需要从自动释放对象上的retain转向引用?

时间:2011-12-09 17:01:16

标签: objective-c release retain autorelease

对于以下代码,1 - 在从getFoo返回的对象上需要保留; 2 - foo方法func中需要释放吗?

- (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];
}

3 个答案:

答案 0 :(得分:2)

如果您alloccopyretain对象需要release它。

在您的示例中,您不需要保留它。但是既然你做了,你确实需要发布它。

答案 1 :(得分:2)

每个retain必须与release匹配。

这就是说,如果你没有推迟它的使用,你的func你不需要retain * foo。 通常自动释放池在运行循环结束时获取drain,因此您有时间在函数中本地使用它。
但是,如果您retain,则必须release

你可以这样做:

return [NSString stringWithString:@"foo];

这是一个向您返回autorelease对象的便捷方法。

答案 2 :(得分:1)

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

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

这会有点整洁。