Protocol 和 Category

Protocol: 帶實現(xiàn)的方法列表,協(xié)議方法分@required和@optional
?? Category:為已有類添加方法的聲明與實現(xiàn)。
(1)只能添加方法,不能添加成員變量,添加屬性要用Runtime運行時來完成;
(2)方法必須實現(xiàn),否則會警告?,調(diào)用后崩潰;
(3)分類方法內(nèi)部可以訪問已有類的成員變量和方法;
(4)添加的方法與已有類同名時會造成覆蓋;
(5)私有方法供內(nèi)部調(diào)用;
?:分類方法的調(diào)用:
(a)在外部調(diào)用(如main函數(shù)),需要導(dǎo)入分類的頭文件;
(b)在本類中調(diào)用,要么分類在.h文件聲明,.m中直接調(diào)用;
要么分類單獨聲明.h、.m兩個文件,本類的.m中導(dǎo)入分類頭文件;
(本類中不導(dǎo)入分類頭文件,鬼知道本類在外部聲明了多少分類文件)
(c)要想在子類中調(diào)用分類方法,需要分類在本體的.h文件中進行聲明。
?:常見的分類多半聲明在本類.h文件中,在外部供本類、子類實例調(diào)用,如UIApplication.h文件中聲明的大量分類方法。

?? Extension (類擴展):匿名分類,專門用來為已有類添加私有的成員變量和方法的聲明以及實現(xiàn);
(1)能同時添加成員變量,屬性和方法,均為私有;
(2)同上;
(3)同上;
(4)同上;
(5)同上;

?? 兩者的區(qū)別(自己總結(jié)的)
(1)聲明上:
協(xié)議:可以聲明方法和屬性,但不能聲明成員變量;
分類:可以聲明方法和屬性,但不能聲明成員變量;
(2)實現(xiàn)上:
協(xié)議:方法可以實現(xiàn),也可以不實現(xiàn);
分類:必須實現(xiàn)(否者編譯可能會通過,但是運行會crash);
(3)存在意義上:
協(xié)議:方法由代理去實現(xiàn),重在對象間的相互通信;
分類:方法由本類或子類實例去實現(xiàn);
?注意:協(xié)議和分類是可以通過@property形式聲明屬性的,只不過在協(xié)議、分類中聲明的屬性,只有對應(yīng)的setter/getter方法的聲明,連實現(xiàn)都沒有,更沒有生成對應(yīng)的成員變量。因為協(xié)議中只可以聲明方法,分類中只能聲明方法和對應(yīng)的實現(xiàn)。
?Q:分類和協(xié)議中聲明屬性的意義是什么呢?
實際上,協(xié)議中聲明的屬性不能算是真正的屬性。完整的屬性聲明包含了成員變量、setter和getter方法的聲明/實現(xiàn),而協(xié)議中的屬性只是聲明了setter和getter方法,并沒有自動實現(xiàn),也不會自動聲明帶下劃線的成員變量。其實它和直接聲明方法本質(zhì)上并沒有區(qū)別,只是形式上更加簡潔,系統(tǒng)經(jīng)常這么做是因為它靠的不是自動生成器,而是自己手動實現(xiàn)并匹配了成員變量(注意,系統(tǒng)在協(xié)議中聲明的屬性絕大多數(shù)都是readOnly的,比如description方法)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容