2011-01-08 101 views
4

Apple的Memory Management Programming Guide顯示了三種用於編寫需要保留或釋放對象引用的訪問器方法的官方認可技術。哪些內存管理技術在哪些情況下更好?

對於前兩種技術(下面轉載),Apple文檔說「技術2的性能明顯優於技術1,因爲在吸氣劑被調用的次數遠多於設定者「。

// Technique 1 
- (NSString*) title 
{ 
    return [[title retain] autorelease]; 
} 

- (void) setTitle: (NSString*) newTitle 
{ 
    if (title != newTitle) 
    { 
     [title release]; 
     title = [newTitle retain]; // Or copy, depending on your needs. 
    } 
} 

// Technique 2 
- (NSString*) title 
{ 
    return title; 
} 

- (void) setTitle: (NSString*) newTitle 
{ 
    [title autorelease]; 
    title = [newTitle retain]; // Or copy, depending on your needs. 
} 

這是技術1和技術2之間的唯一區別,還是使用了另一種具有的我可能需要知道其他微妙的後果?如果技術2使用性能更好的吸氣劑,是否遵循該技術1使用性能更好的吸氣劑,因爲title獲得了明確的(並且可能是立即的)釋放?

回答

0

第二個getter很脆弱(如果有人訪問對象的title然後釋放該對象,它將會崩潰),所以第一個通常是優選的,即使速度稍慢。

第一個設置器效率更高,即使在自動釋放池不存在的情況下也可以工作,所以它更可取。效率更高的原因不僅僅是因爲autorelease和release - 如果你嘗試將屬性設置爲現有值,它根本就不會做任何工作。

+0

如果dealloc方法適當地通過訪問器清除變量,那麼第二個技術不會導致崩潰因爲標題將被自動釋放,並且當新標題不同時,第二個二傳手更快。但它的確使用了更多的內存,因爲舊的標題並未立即發佈。 – ughoavgfhw 2011-01-09 03:14:51

1

從2吸氣和從1設定器:

- (NSString*) title 
{ 
    return title; 
} 

- (void) setTitle: (NSString*) newTitle 
{ 
    if (title != newTitle) 
    { 
     [title release]; 
     title = [newTitle retain]; // Or copy, depending on your needs. 
    } 
} 
相關問題