2011-12-09 66 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創建一個已經自動釋放的字符串。

這會有點整齊。

相關問題