Objective-C的面向對象中,類有真正的私有方法和私有屬性么?


在Java/C#等面向對象語言中,方法的訪問權限可以通過public/private/protected來控制其訪問權限。而在OC中,方法卻並沒有訪問修飾符。那么,我們有沒有辦法使其方法變為私有?

1. 如果一個方法不在頭文件中聲明,那么這個方法在編譯期,通過[receiver MethodName]的形式向對象發送消息,編譯器會有警告,告訴你未找到該方法,但是實際運行時,依然可以正常運行

原因:編譯時,即使這個方法不在頭文件中聲明,編譯器仍然會將方法的簽名編譯進類的方法列表中, 發送消息時,會自動查找消息列表,如果找到同名消息,則會被觸發)

 

2.如果一個方法在匿名分類中定義,那么在編譯期,編譯器通過[receiver MethodName]的形式向對象發送消息,編譯器仍然會有警告,告訴你未找到該方法,但是實際運行時,仍然可以正常運行

原因:同上

 

結論:在OC中,其實並無真正意義上的私有方法。

 

有真正的私有屬性么?

1. 如果將一個屬性在方法的匿名分類中定義,那么在編譯期,通過obj.prop 向屬性賦值時,編譯器會提示錯誤,編譯不通過。 這么看來,貌似是可以定義私有屬性的。

但是。。。。

我們知道,OC中所有的方法調用都是通過消息傳遞,即使你使用了obj.prop 這種點語法去為對象屬性賦值,其編譯后的代碼仍然是轉換為消息的調用。

obj.prop 其實是向對象發送了一個setProp方法,等價於[obj setProp] 。 

根據上面的解釋,如果你用[obj setProp] 去向這個所謂的"私有屬性"賦值,仍然可以賦值成功,並且可以正常使用。

 

綜上,OC中其實並無真正意義上的的私有方法和私有屬性。但是在實際使用中,我們應遵守規則,不能調用的方法,不調用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM