術語「自動」有點可怕。這意味着保留和釋放以某種方式由幕後運行時神奇地應用。真的真的,唯一一次的東西保留時,爲它發送包含以下內容的消息:新的Alloc保留複製(N.A.R.C)。唯一一次發佈的時候是發送釋放消息或自動釋放消息。所以你真正需要了解的是,在什麼情況下發送這些方法?
1.設置屬性
你是對的,只要你去了。爲什麼?因爲屬性只是用於生成getter和setter方法的語法糖。例如,self.myString = @"Foo";
與[self setMyString:@"Foo"]
完全相同。你需要了解的是,當你聲明與保留語義的性質,實際上是因爲像這樣的方法:
- (void)setMyString:(NSString *)newString {
if (newString != myString) {
[myString release];
myString = [newString retain];
}
}
因此,很明顯,他說self.myString = someOtherString
將導致保留新值。你所說的「設置不帶self.
的財產」實際上只是直接的伊娃分配。由於沒有使用點運算符,因此沒有調用方法,因此您知道沒有保留任何方法。
2.和3.與方法範圍有關的事情?
這些都不是真的。約定表示變量返回了我的方法,但沒有名稱中的NARC痕跡將被自動釋放。這是方法作者實際遵循慣例。就像方法調用的結果一樣,任何事情都不會自動保留或釋放。
請注意,您提供的方法在原則上是正確的,但永遠不會如何正確執行setter。你寫它的方式,如果newString == myString,並且你最後保留了它,那麼它會在你保留它並崩潰之前釋放它。您必須保留之前保留,autorelease之前保留,或檢查相等。我個人在發佈之前使用保留。 – 2011-06-16 20:28:14
@Rob,絕對。我正在尋找一個儘可能簡化的例子,以避免分散注意力。澄清可能是一個好主意。 – 2011-06-16 20:30:30
由於我們都同意這是個好主意,我爲您澄清了代碼。 :-) – 2011-06-16 23:43:53