在Java/C#等面向?qū)ο笳Z言中,方法的訪問權(quán)限可以通過public/private/protected來控制其訪問權(quán)限。而在OC中,方法卻并沒有訪問修飾符。那么,我們有沒有辦法使其方法變?yōu)樗接校?/p>
- 如果一個方法不在頭文件中聲明,那么這個方法在編譯期,通過[receiver MethodName]的形式向?qū)ο蟀l(fā)送消息,編譯器會有警告,告訴你未找到該方法,但是實際運(yùn)行時,依然可以正常運(yùn)行
原因:編譯時,即使這個方法不在頭文件中聲明,編譯器仍然會將方法的簽名編譯進(jìn)類的方法列表中, 發(fā)送消息時,會自動查找消息列表,如果找到同名消息,則會被觸發(fā))
2.如果一個方法在匿名分類中定義,那么在編譯期,編譯器通過[receiver MethodName]的形式向?qū)ο蟀l(fā)送消息,編譯器仍然會有警告,告訴你未找到該方法,但是實際運(yùn)行時,仍然可以正常運(yùn)行
原因:同上
結(jié)論:在OC中,其實并無真正意義上的私有方法。
有真正的私有屬性么?
- 如果將一個屬性在方法的匿名分類中定義,那么在編譯期,通過obj.prop 向?qū)傩再x值時,編譯器會提示錯誤,編譯不通過。 這么看來,貌似是可以定義私有屬性的。
但是。。。。
我們知道,OC中所有的方法調(diào)用都是通過消息傳遞,即使你使用了obj.prop 這種點(diǎn)語法去為對象屬性賦值,其編譯后的代碼仍然是轉(zhuǎn)換為消息的調(diào)用。
obj.prop 其實是向?qū)ο蟀l(fā)送了一個setProp方法,等價于[obj setProp] 。
根據(jù)上面的解釋,如果你用[obj setProp] 去向這個所謂的"私有屬性"賦值,仍然可以賦值成功,并且可以正常使用。
綜上,OC中其實并無真正意義上的的私有方法和私有屬性。但是在實際使用中,我們應(yīng)遵守規(guī)則,不能調(diào)用的方法,不調(diào)用