2009-02-11 86 views

回答

2

self語法使用accessor方法,其他語法不使用。這可能是一個很大的區別,如果訪問者做的不僅僅是分配新值。請參閱Objective-C教程的Declared Properties部分。

13

@synthesize指令告訴編譯器根據.h文件中@property指令中給出的規範爲您的成員變量生成訪問器。 (也就是說,如果指定了保留,那麼setter將保留該變量,並且如果指定了副本,它將複製它。)

訪問器將(除非另有指定)命名爲propertyName和setPropertyName。

使用。符號(注意,不是上面提到的自我語法)是說你想要使用訪問器(例如,如果你設置字符串,並且想要確保保留計數是正確的,那麼這是一件好事)。

所以,你的類實現中:

  • self.bill =弗雷德將調用 訪問setBill。
  • bill = fred將直接設置賬單到fred ,而不通過 訪問者。
2

其他答案是正確的,區別在於點符號會導致通過附件而不是直接改變伊娃。

直到你知道你在做什麼,我建議你使用點符號(即self.propertyName = ...)。 Cocoa/Obj-C在鍵值編碼方面做了很多工作,而手機SDK沒有充分利用這一點(像綁定那樣的東西),最終它會。現在習慣使用訪問器將在未來爲您節省很多麻煩。

使用訪問器方法還可以讓您覆蓋它們並在需要時提供更多功能。通過簡單地改變伊娃的價值,你就會奪取這種能力。

5

一個我發現開始Cocoa開發時的差異是,如果我設置變量使用@財產/ @進行綜合語法和我沒有使用self.myVariable = OBJ[自setMyVariable:OBJ]而是myVariable = obj,如果obj稍後發佈,則不保留該對象。 (假設@Property設置爲使用保留。)

原因是使用時未設置保留計數myVariable = obj並且當obj被釋放時計數現在爲零。 (除非你自己保留它)但通過使用訪問器它將爲你保留計數。 (再次假設您在聲明時使用retain來設置它)。

14

需要注意的是,dot-syntax被編譯器轉換爲一個簡單的objc_msgSend調用是非常重要的:也就是說它下面的行爲與發送給該變量訪問器的消息完全相同。因此,所有三個以下是等價的:

self.myVariable = obj; 

[self setMyVariable:obj]; 

objc_msgSend(self, @selector(setMyVariable:), obj); 

當然,這意味着,使用點語法實際上會導致一個完整的郵件發送,這意味着呼籲是與它相關聯的新功能,所有的開銷。相比之下,使用簡單賦值(myVariable = obj;)不會產生這種開銷,但它當然只能用於相關類的實例方法中。

4

Shyne

如果我可以添加一個重要的註釋。上面的答案都很棒,所以我不會加入技術方面。但是,僅僅這樣的:

如果創建一個合成屬性

@synthesize myProp; 

始終使用self.myProp模式進行設置。

self.myProp = newVal; 

這似乎很明顯,但它很重要。確實沒有理由這樣做,但是直到你真正理解了如何創建合成設置器,你只是想假設你必須使用自我。模式來設置值。

誠實:這將爲您節省很多深夜調試會話。非保留內存訪問違規是最糟糕的調試。

相關問題