0

當看到有關Objective-C的性能,我一直被告知要制定者(或讓屬性機制使制定者)是這樣的:垃圾收集和屬性setter保留/釋放

- (void)setMyProperty:(MyClass *)newValue 
{ 
    [newValue retain]; 
    [ivInstanceVariable release]; 
    ivInstanceVariable = newValue; 
} 
// or 
- (void)setMyProperty:(MyClass *)newValue 
{ 
    [ivInstanceVariable autorelease]; 
    ivInstanceVariable = [newValue retain]; 
} 

我不沒有得到它。我知道retain遞增對象計數器和release減一垃圾收集,但如何能更簡單:

- (void)setMyProperty:(MyClass *)newValue 
{ 
    ivInstanceVariable = newValue; 
} 

導致內存泄漏?謝謝。

+2

如果你正在建設有垃圾收集您的應用程序啓用,既'-retain'和'-release'沒有操作。 – 2011-05-03 05:32:36

回答

2

當您調用set方法時,您不知道傳遞的對象上的保留計數是多少。它可能是1,並且可能會在調用set方法後立即調用release。

這是set方法的責任,指出不應該通過調用retain來釋放該對象。

至於調用釋放,當一個新的值被設置時,你的set方法應該調用釋放舊值來表明它不再需要它。

最後,您應該在新值上調用retain並按舊值釋放,因爲可能會傳遞與已設置的值完全相同的值。

+0

@OP只要想一想擁有該物體的所有權,就可以「保留」 - 「釋放」舞蹈。簡單地獲取對象的指針引用是不夠的。 – 2011-05-03 06:29:21

0

經典模式的「非原子保留」二傳手是...

- (void)setMyProperty:(MyClass *)newValue 
{ 
if (ivInstanceVariable != newValue) { 
[ivInstanceVariable release]; 
ivInstanceVariable = [newValue retain]; 
} 
} 

if測試保證了NEWVALUE是不同的,而且,你不旋轉你的車輪呼籲釋放和保留在當前目的。額外開銷是不保留太糟糕了,但使用複製另一回事......

- (void)setMyProperty:(MyClass *)newValue 
{ 
if (ivInstanceVariable != newValue) { 
[ivInstanceVariable release]; 
ivInstanceVariable = [newValue copy]; 
} 
}