2011-12-09 65 views
1

对于下面的代码,1 - 从getFoo返回的对象上需要保留; 2 - 是方法func中foo所需的版本吗?是否需要从autorelease对象上保留的参考版本?

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

回答

2

每个retain必须匹配release

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

而且你可以这样做:

return [NSString stringWithString:@"foo]; 

这是一种便捷梅索德返回一个autorelease对象给你。

2

如果alloccopyretain需要release它的对象。

在你的例子中,你不需要保留它。但是既然你做了,你确实需要释放它。

1

你写的代码很好。 当您分配字符串时,它的保留计数是1. 然后您自动释放将在稍后时间递减保留计数的字符串。 您使用foo。 然后,您不需要释放它,因为您已经自动释放它,它会在稍后自动释放。

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

这会有点整齐。

相关问题