一入門篇
1 什麼是category?ios
category能夠用於爲已有的類添加方法(只能添加方法不能添加屬性)有點相似於繼承,除此以外,apple還推薦了category的另外兩個使用場景: **1.把類的實現分步在多個文件中,精簡了單個文件的體積把類的實現按照功能分佈在不一樣的文件中,同時也助於團隊的開發,也能夠按需加載所需的category。** **2.聲明私有方法 (若是不在接口中聲明方法而只是在實現文件中直接實現一個方法用於完成在頭文件中所給出的公共接口編譯時會有警告,那麼能夠在.m文件的開頭定義一個category並添加相應的方法從而消除編譯的警告)** **3.模擬多繼承** **4.framework私有方法公開** **5.用於非正式協議(典型的例子是代理ios那些自帶的代理幾乎都是NSObject的類別,因此任何一個OC對象均可以成爲代理,NSObject是OC對象的父類)**
2 category和extension的區別app
extension在編譯期間起做用,而category是在運行時動態添加的,因此category能夠給(通常也是隻給)未知源碼的類(NSString)添加方法,而extension只能用於本身定義(即源碼已知的)類添加方法。另外extension能夠給類添加實例變量,但category沒法添加實例變量。應爲在運行期間對象的內存佈局已經肯定,若是添加實例變量就會破壞類的內存佈局,這對編譯型語言是災難性的
3.category的底層面目
全部的OC類和對象,在runtime層都是用struct實現的category對應category_t佈局
typedef struct category_t{ const cahr*name;//類的名字 classref_ cls;//類 struct method_list_t* instanceMethods;//category中全部給類添加的實例方法的列表 Struct method_list_t*classMethod;//category中全部添加的類方法列表 Struct protocal_list_t *protocals;//category實現全部協議的列表 Struct property_list_t*instanceProperties;//category中添加的全部屬性 }category_t 4.實現一個category MyClass.h #import<Foundation/Foundation.h> @interface Myclass:NSObject -(void)printName; @end @interface Myclass(MyAddtion) @property(notamic ,copy)NSString *name;(這不是一個實例變量,只是一個屬性,等效於設置了一個get和set方法) -(void)printName; @end