self.myVariable = obj;
和myVariable = obj;
之間有什麼區別,當我用@propery
/@synthesize
創建`myVariable?self.variable and variable difference
回答
self
語法使用accessor方法,其他語法不使用。這可能是一個很大的區別,如果訪問者做的不僅僅是分配新值。請參閱Objective-C教程的Declared Properties部分。
@synthesize指令告訴編譯器根據.h文件中@property指令中給出的規範爲您的成員變量生成訪問器。 (也就是說,如果指定了保留,那麼setter將保留該變量,並且如果指定了副本,它將複製它。)
訪問器將(除非另有指定)命名爲propertyName和setPropertyName。
使用。符號(注意,不是上面提到的自我語法)是說你想要使用訪問器(例如,如果你設置字符串,並且想要確保保留計數是正確的,那麼這是一件好事)。
所以,你的類實現中:
- self.bill =弗雷德將調用 訪問setBill。
- bill = fred將直接設置賬單到fred ,而不通過 訪問者。
其他答案是正確的,區別在於點符號會導致通過附件而不是直接改變伊娃。
直到你知道你在做什麼,我建議你使用點符號(即self.propertyName = ...
)。 Cocoa/Obj-C在鍵值編碼方面做了很多工作,而手機SDK沒有充分利用這一點(像綁定那樣的東西),最終它會。現在習慣使用訪問器將在未來爲您節省很多麻煩。
使用訪問器方法還可以讓您覆蓋它們並在需要時提供更多功能。通過簡單地改變伊娃的價值,你就會奪取這種能力。
一個我發現開始Cocoa開發時的差異是,如果我設置變量使用@財產/ @進行綜合語法和我沒有使用self.myVariable = OBJ或[自setMyVariable:OBJ]而是myVariable = obj,如果obj稍後發佈,則不保留該對象。 (假設@Property設置爲使用保留。)
原因是使用時未設置保留計數myVariable = obj並且當obj被釋放時計數現在爲零。 (除非你自己保留它)但通過使用訪問器它將爲你保留計數。 (再次假設您在聲明時使用retain來設置它)。
需要注意的是,dot-syntax被編譯器轉換爲一個簡單的objc_msgSend調用是非常重要的:也就是說它下面的行爲與發送給該變量訪問器的消息完全相同。因此,所有三個以下是等價的:
self.myVariable = obj;
[self setMyVariable:obj];
objc_msgSend(self, @selector(setMyVariable:), obj);
當然,這意味着,使用點語法實際上會導致一個完整的郵件發送,這意味着呼籲是與它相關聯的新功能,所有的開銷。相比之下,使用簡單賦值(myVariable = obj;)不會產生這種開銷,但它當然只能用於相關類的實例方法中。
Shyne
如果我可以添加一個重要的註釋。上面的答案都很棒,所以我不會加入技術方面。但是,僅僅這樣的:
如果創建一個合成屬性
@synthesize myProp;
始終使用self.myProp模式進行設置。
self.myProp = newVal;
這似乎很明顯,但它很重要。確實沒有理由這樣做,但是直到你真正理解了如何創建合成設置器,你只是想假設你必須使用自我。模式來設置值。
誠實:這將爲您節省很多深夜調試會話。非保留內存訪問違規是最糟糕的調試。
- 1. Javascript variable and smarty
- 2. Activator.CreateInstance(string)and Activator.CreateInstance <T>()difference
- 3. self.variable和self-> variable之間的區別是什麼?
- 4. Objective C _underscore vs self.variable
- 5. ViewRendererServlet vs Dispatcherservlet Difference
- 6. @JsonIgnore vs @Transient -difference?
- 7. 兩列SQL DIfference
- 8. jQuery Array Difference
- 9. UIApplicationDidBecomeActive vs UIApplicationWillEnterForeground difference
- 10. PHP Regular Expression difference
- 11. Python&Mysql:Select variable with variable
- 12. set javascript variable =「variable」
- 13. Difference bettwen DataContractSerializer和DataContractJsonSerializer
- 14. iOS 9/10 NavigationController Difference
- 15. Java String array Output Difference
- 16. Hortonworks vs Cloudera Architecture Difference
- 17. zfr-rest和apigilty difference
- 18. Angular2localization vs ng2-translate difference
- 19. Valid/Validated-Difference(XML,DTD)
- 20. Ember.js等價於.difference?
- 21. Group By Row Value Difference
- 22. 使用實例變量&self.variable
- 23. 「class variable」,「class variable()」和「class variable(argument)
- 24. 語法「variable = variable = variable;」發生了什麼?
- 25. Rails 3 -rendering partials and error「undefined local variable or method」
- 26. URL-Rewriting/Anything/Variable detail.php?pid = variable
- 27. IF variable ='something'INSERT IF variable ='somethingelse'INSERT
- 28. Powershell - 「Clear-Item variable:」vs「Remove-Variable」
- 29. 表達式「variable,variable = value;」
- 30. CouchDB set-difference/not-in condition