2011-06-16 98 views
1

我很清楚自動保留和發佈的內容,但是我找不到任何有關這方面的官方數據,並且我認爲我弄錯了一些東西。什麼會自動保留和發佈?

  1. 設置被聲明用@property(保留)屬性將保留和釋放舊的值,但沒有self.
  2. 不設置相同的對象內的特性的方法(包括參數)內的所有對象都保留當方法返回時創建/傳遞並釋放。
  3. 一個方法返回的對象不會被釋放,而是會被它返回的方法釋放,因爲它的方法內部是局部變量。

我弄錯了什麼/忘記了什麼嗎?
退貨被丟棄時會發生什麼?像[object someMethodThatReturnsAnObject];。它不會返回到它的方法的本地,所以我不確定它是否會被釋放,並且xCode會警告它。

回答

3

而不是猜測,read the documentation。這是明確的。該聲明 與@財產(保留)將保留和釋放 舊值

設置屬性,但沒有自我沒有設置相同的對象 內 屬性。

的排序。沒有「沒有自我設置財產」。這是直接設置一個實例變量。

的方法(包括 參數)內的所有對象時,創建/傳遞和 方法返回時釋放 被保留。

都能跟得上;看文檔。

,其由方法 返回將不被釋放,而是一個目的將 通過該方法被釋放其由於 方法內它的本地變量返回 到。

完全沒有;看文檔。

2

使用@property(retain)聲明的設置屬性將保留並釋放舊值,但不會在沒有self的情況下設置同一對象內的屬性。

調用爲保留屬性合成的setter方法將釋放舊值並保留新值。直接設置伊娃而不通過您的訪問者,只會分配伊娃。它既不保留也不釋放任何東西。 self.foo = bar正好是[self setFoo:bar]。無論什麼setFoo:都會完成(合成的保留版本setFoo:如上所述工作)。 foo = bar正好是foo = bar

當方法返回時,方法內的所有對象(包括參數)在創建/傳遞時被保留。

這根本不是真的。他們既不被保留也不被釋放。保持和釋放不會神奇地發生。它發生在響應一方面要求alloc,new,copy,retain而另一方面要求release。使用點符號只是一個方法調用的簡寫,其中可能有一個retain

一個方法返回的對象不會被釋放,而是會被它返回的方法釋放,因爲它的方法內部是局部變量。

這是不正確的。方法返回的對象既不會被保留也不會被釋放。按照慣例,在名稱中使用allocnewcopy的方法將返回一個淨+1保留。任何其他方法都會返回一個淨0保留計數(對於保留,對象上的自動釋放量將盡可能多)。 「當前」保留計數將始終大於0,否則無法返回對象。 (這是對事實的輕微說明,如果有私人保留,這兩種情況下的保留數都可能大於1,但從調用者的角度來看,這是一種考慮它的有用方法。)

最好看的地方是Practical Memory Management,這一切都非常簡潔。內存管理編程指南的其餘部分將給出更多示例。

1

術語「自動」有點可怕。這意味着保留和釋放以某種方式由幕後運行時神奇地應用。真的真的,唯一一次的東西保留時,爲它發送包含以下內容的消息:的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痕跡將被自動釋放。這是方法作者實際遵循慣例。就像方法調用的結果一樣,任何事情都不會自動保留或釋放。

+2

請注意,您提供的方法在原則上是正確的,但永遠不會如何正確執行setter。你寫它的方式,如果newString == myString,並且你最後保留了它,那麼它會在你保留它並崩潰之前釋放它。您必須保留之前保留,autorelease之前保留,或檢查相等。我個人在發佈之前使用保留。 – 2011-06-16 20:28:14

+0

@Rob,絕對。我正在尋找一個儘可能簡化的例子,以避免分散注意力。澄清可能是一個好主意。 – 2011-06-16 20:30:30

+0

由於我們都同意這是個好主意,我爲您澄清了代碼。 :-) – 2011-06-16 23:43:53