1
我更喜歡寫「self.foo」而不是「_foo」,主要是出於風格原因。理論上,self.foo表示函數調用,而_foo不表示。我認爲這很好,因爲對於大多數代碼來說這不太可能重要。Objective-C屬性(self.foo)比使用ivars(_foo)有更多的開銷嗎?
我的問題是:編譯器是否優化到相同的東西嗎?也許它不能,由於方法調整?有沒有人有任何見解?
我更喜歡寫「self.foo」而不是「_foo」,主要是出於風格原因。理論上,self.foo表示函數調用,而_foo不表示。我認爲這很好,因爲對於大多數代碼來說這不太可能重要。Objective-C屬性(self.foo)比使用ivars(_foo)有更多的開銷嗎?
我的問題是:編譯器是否優化到相同的東西嗎?也許它不能,由於方法調整?有沒有人有任何見解?
不,編譯器不會將其優化爲僅實例變量訪問。它不能優化它,因爲類可能有一個覆蓋getter方法的子類。 (請注意,子類可以在運行時創建!)
但是,除非您已對代碼進行概要分析並確定它是瓶頸,否則不應該擔心消息發送開銷。
要添加更多信息,請記住,合成屬性方法將包含KVO的代碼,如果該屬性被標記爲「atomic」,它也會爲其添加代碼。回到MRC時代,這些方法添加了用於正確內存管理的代碼。所以是的,與簡單訪問伊娃相比,開銷要多得多。但是,正如羅布所言,除非由於使用財產的方法而不是直接接受伊娃的行爲,否則不要擔心其中的任何問題。 – rmaddy
[KVO在運行時添加setter覆蓋](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOImplementation.html),而不是編譯時。另外,KVO不會重寫獲取者,而只會重寫setter。 [核心數據要求自定義getter調用'willAccessValueForKey:'和'didAccessValueForKey:'。](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/#//apple_ref/OCC/instm/NSManagedObject/didAccessValueForKey :)。 –