2011-07-15 38 views
4

我正在使用Objective-C屬性爲我處理保留/釋放實例變量。在我的課,我做這樣的東西:Objective-C屬性 - 正在使用[self myProperty]或self.myProperty比myProperty慢?

self.myProperty = somethingIWantToRetain 
[self.myProperty doSomeAction] 
[self.myProperty doSomethingElse] 

是使用[自myProperty的]/self.myProperty比單純使用myProperty的那些地方我不會改變myProperty的價值線慢?下面的例子會更快嗎?

self.myProperty = somethingIWantToRetain 
[myProperty doSomeAction] 
[myProperty doSomethingElse] 

感謝

回答

5

這幾乎肯定是有點慢,但它不可能太大關係。

直接引用你的伊娃(用裸體myProperty)直接訪問變量。提到你的財產獲得者(與等效的self.myProperty[self myProperty])必須調用一種方法,該方法通常在你的伊娃爾上執行retainautorelease

然而,Objective-C的方法調度是非常非常快,保留/自動釋放通話是相當便宜的爲好,特別是對於那些將當自動釋放池清空可能不被破壞的對象。我會把重點放在可讀性和一致的風格上,只有在發現性能瓶頸時才擔心性能。

1

是的,它會稍微快一些,但通過這種微型優化,你不太可能明顯提高性能。如果您使用self.myProperty,稍後可以決定實施不同的存取方法,而無需在任何地方更改代碼。

2

使用Objective-C 2.0點語法相當於調用getter,所以第一個片段會比較慢,因爲它會產生兩個額外的動態調度。

也就是說,損失很小,顯然你會獲得更高的靈活性,能夠在以後更改setter和getter(例如,如果最終使得該值隱含,從而不是技術上的存儲在內存中,或將它傳遞給第三個對象,或者做一些異步的存儲操作,可能需要在某些情況下阻止getter)。

4

確切地說,當您編寫[myProperty doSomeAction]時,實際上並未訪問該屬性,而是直接訪問實例變量(用作該屬性的後備變量)。

你只能訪問屬性(直通其setter和getter)用點符號[self.myProperty doSomeAction](或調用的setter /吸氣劑明確像[[self myProperty] doSomeAction]這是完全等效,因爲這是編譯器編譯什麼編譯時您代碼)

所以,當你寫[myProperty doSomeAction],因爲它直接訪問該變量 - 違背[self.myProperty doSomeAction]它調用的myProperty從而使額外的方法調用/消息發送,吸氣 - 然後是在理論上它會更快,你將獲得一個消息發送。

但在實踐中,你不會看到任何改善,所以沒有必要考慮直接訪問變量(如果你想在以後實現它的另一種方式它會讓你失去靈活性)


此外,如果您使用Modern Runtime(如果您爲iOS的任何版本編寫代碼,Legacy Runtime僅用於32位Mac OSX),則不再需要顯式定義該屬性的支持變量。因此,你可以在.m和@synthesize中聲明@property它沒有任何實例變量(編譯器會在編譯時爲你生成它),在這種情況下,你將無法調用(non-現有的)實例變量! (至少不在@synthesize指令之前)

+0

答案的最後一部分不正確。有一個編譯器錯誤阻止了它,但它可以使用合成的伊娃。請參閱[我的答案](http://stackoverflow.com/questions/6592592/what-is-modern-runtime/6593459#6593459)到「什麼是現代運行時?」。 –

+0

是的你是對的我同意,我只是爲了簡單而寫的;無論如何請注意,您只能在代碼中的@synthesize指令之後使用ivar *。 (其實,我認爲如果你自己沒有創造它,最好不要依靠伊娃,只在這種情況下直接使用財產)。但是,謝謝你指出這一點,這是很好的知道這仍然是一種可能性;) – AliSoftware

2

在操作中又多了一步?是。 由於顯着或現實較慢而變慢?絕對不。

您必須記住,現代cpus以每秒數百萬次的運算運行程序。在幾乎所有語言中,調用getter方法的速度與訪問ivar本身的速度基本相同(尤其是在getter方法中沒有其他代碼時)。

使用getter而不是直接訪問ivars是個好習慣,所以我不會試圖通過忽略它們來「加快速度」。

相關問題