iOS中category即:類別 棒动;extension 為擴張
一.category
類別是一種為現(xiàn)有的類添加新方法的方式。
利用Objective-C的動態(tài)運行時分配機制酝碳,Category提供了一種比繼承(inheritance)更為簡潔的方法來對class進行擴展遂跟,無需創(chuàng)建對象類的子類就能為現(xiàn)有的類添加新方法蓬推,可以為任何已經(jīng)存在的class添加方法,包括那些沒有源代碼的類(如某些框架類)俺抽。
1.類別的局限:(1)無法向類別中添加新的實例變量敞映,類別沒有位置容納實例變量。如果一定要添加實例變量凌埂,可以采用runtime 庫objc_setAssociatedObject / objc_getAssociatedObject 函數(shù)來解決驱显。objc_setAssociatedObject 就是將一個對象跟另一個對象進行關(guān)聯(lián),并用一個key來標示瞳抓,objc_getAssociatedObject 就是用這個key來拿到與receiver相關(guān)聯(lián)的一個對象埃疫。
注意:必須使用@dynamic來讓編譯器知道我們自己實現(xiàn)setter/getter方法(如果對于@dynamic有疑問,請參見:http://stackoverflow.com/questions/1160498/synthesize-vs-dynamic-what-are-the-differences)
不能使用@synthesize(也不能@dynamic 和@synthesize都不寫孩哑,什么都不寫在最新的xcode里是默認@synthesize)栓霜,@synthesize會自動生成成員變量,并自動生成setter/getter方法横蜒。
最后胳蛮,objc_setAssociatedObject 的關(guān)聯(lián)的policy 可以根據(jù)自己的需求使用,這個例子使用 OBJC_ASSOCIATION_RETAIN_NONATOMIC來標示一個strong reference來指向被關(guān)聯(lián)的對象丛晌。
(2)名稱沖突仅炊,即當類別中的方法名與原始類中的名稱相同的時候,類別具有更高的優(yōu)先級澎蛛。類別的方法將完全取代原始方法而無法再使用原始方法抚垄。
2.類別的作用
類別的作用主要有三個:
(1)可以將類的實現(xiàn)分散到多個不同的文件或者不同的框架中,方便代碼的管理。也可以對框架提供類的擴展(沒有源碼呆馁,不能修改)桐经。
(2)創(chuàng)建對私有方法的前向引用:如果其他類中的方法未實現(xiàn),在你訪問其他類的私有方法時編譯器報錯這時使用類別浙滤,在類別中聲明這些方法(不必提供方法實現(xiàn))阴挣,編譯器就不會再產(chǎn)生警告
(3)向?qū)ο筇砑臃钦絽f(xié)議:創(chuàng)建一個NSObject的類別稱為“創(chuàng)建一個非正式協(xié)議”,因為可以作為任何類的委托對象使用纺腊。
二.Extension 的使用
首先還是需要創(chuàng)建相關(guān)類的擴展畔咧,即方法的聲明,然后在需要擴張的類中引入頭文件揖膜,然后實現(xiàn)聲明的方法盒卸。
三.Category 與Extension 的區(qū)別
1.形式上看:extension 是匿名的category
2.extension中聲明的方法需要在mainimplementation中實現(xiàn),而category 不做強制要求
3.extension 可以添加屬性次氨、成員變量蔽介,而category 一般不可以。