iOS中category即:類別 ;extension 為擴(kuò)張
一.category?
類別是一種為現(xiàn)有的類添加新方法的方式棠笑。
利用Objective-C的動態(tài)運(yùn)行時分配機(jī)制销部,Category提供了一種比繼承(inheritance)更為簡潔的方法來對class進(jìn)行擴(kuò)展缴饭,無需創(chuàng)建對象類的子類就能為現(xiàn)有的類添加新方法,可以為任何已經(jīng)存在的class添加方法繁调,包括那些沒有源代碼的類(如某些框架類)萨蚕。
1.類別的局限:(1)無法向類別中添加新的實(shí)例變量,類別沒有位置容納實(shí)例變量蹄胰。如果一定要添加實(shí)例變量岳遥,可以采用runtime 庫objc_setAssociatedObject / objc_getAssociatedObject 函數(shù)來解決。objc_setAssociatedObject 就是將一個對象跟另一個對象進(jìn)行關(guān)聯(lián)裕寨,并用一個key來標(biāo)示浩蓉,objc_getAssociatedObject 就是用這個key來拿到與receiver相關(guān)聯(lián)的一個對象。
注意:必須使用@dynamic來讓編譯器知道我們自己實(shí)現(xiàn)setter/getter方法(如果對于@dynamic有疑問宾袜,請參見:http://stackoverflow.com/questions/1160498/synthesize-vs-dynamic-what-are-the-differences)
? ? ? ? ?不能使用@synthesize(也不能@dynamic 和@synthesize都不寫捻艳,什么都不寫在最新的xcode里是默認(rèn)@synthesize),@synthesize會自動生成成員變量庆猫,并自動生成setter/getter方法认轨。
? ? ? ? ?最后,objc_setAssociatedObject 的關(guān)聯(lián)的policy 可以根據(jù)自己的需求使用月培,這個例子使用 OBJC_ASSOCIATION_RETAIN_NONATOMIC來標(biāo)示一個strong reference來指向被關(guān)聯(lián)的對象嘁字。
(2)名稱沖突,即當(dāng)類別中的方法名與原始類中的名稱相同的時候杉畜,類別具有更高的優(yōu)先級纪蜒。類別的方法將完全取代原始方法而無法再使用原始方法。
2.類別的作用
類別的作用主要有三個:
(1)可以將類的實(shí)現(xiàn)分散到多個不同的文件或者不同的框架中此叠,方便代碼的管理纯续。也可以對框架提供類的擴(kuò)展(沒有源碼,不能修改)拌蜘。
?(2)創(chuàng)建對私有方法的前向引用:如果其他類中的方法未實(shí)現(xiàn)杆烁,在你訪問其他類的私有方法時編譯器報錯這時使用類別牙丽,在類別中聲明這些方法(不必提供方法實(shí)現(xiàn))简卧,編譯器就不會再產(chǎn)生警告
?(3)向?qū)ο筇砑臃钦絽f(xié)議:創(chuàng)建一個NSObject的類別稱為“創(chuàng)建一個非正式協(xié)議”,因?yàn)榭梢宰鳛槿魏晤惖奈袑ο笫褂谩?br>
二.Extension 的使用
? ?首先還是需要創(chuàng)建相關(guān)類的擴(kuò)展烤芦,即方法的聲明举娩,然后在需要擴(kuò)張的類中引入頭文件,然后實(shí)現(xiàn)聲明的方法。
三.Category 與Extension 的區(qū)別
1.形式上看:extension 是匿名的category
2.extension中聲明的方法需要在mainimplementation中實(shí)現(xiàn)铜涉,而category 不做強(qiáng)制要求
3.extension 可以添加屬性智玻、成員變量,而category 一般不可以芙代。