2010-10-08 53 views
1

與許多objc開發者一樣,我最終閱讀並重新閱讀了Apple內存管理編程指南,因爲這是理解保留/釋放/自動釋放機制的最佳方式。Apple內存管理編程指南/硬示例

在這個頁面中,真的是有一個例子,我不明白:

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAccessorMethods.html#//apple_ref/doc/uid/TP40003539-SW1

塊引用

技術1

在技術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. 

} 

}

由於對象從get訪問在當前範圍自動釋放返回,如果屬性值發生變化,也仍然有效。這使訪問器更加健壯,但是以額外開銷爲代價。如果您期望經常調用getter方法,則保留和自動釋放對象的額外成本可能不值得性能成本。

技術2

像技術1,技術2也使用一個自動釋放技術,但這次是在setter方法這樣做:

- (NSString*) title { 

return title; 

}

- (void) setTitle: (NSString*) newTitle { 

[title autorelease]; 

title = [newTitle retain]; // Or copy, depending on your needs. 

}

技術2的性能明顯優於技術1的s在那裏吸氣劑被稱爲比二傳手更頻繁。

塊引用

好,強烈的思想最終我理解蘋果公司所說的話幾分鐘,對於具有後的原因[標題保留]自動釋放。但是如果我想合成它,我怎麼能指定一個setter?我只知道保留或複製作爲setter的訪問方法。例如:

@property (retain) NSString* title 

會讓每個I設置一個新值,以標題時間標題保留。但是如何指定getter會像例子一樣返回[[title retain] autorelease]?是否它由XCode以這種方式隱式合成?

問候, Apple92

回答

2

如果你使用@synthesize,你並不需要關心的getter和setter的實現,只要你所指定的屬性選項(保留,複製等)正確。編譯器會爲你做正確的事情。

Unless you see actual perf problems regarding the getters and setters (which would be doubtful), I wouldn't worry about how it's implemented internally.


如果你真的想使用一個特定的getter或setter,只是實現它在你的類。即使你有一個@synthesize語句,你的實現也會被使用。或者,您可以實現getter和setter,並完全忽略@synthesize語句。


OR你可以specify the getter or setter accessor method name在你的財產申報。