2-1 OC 類別(分類)
阿新 • • 發佈:2018-05-19
work 拷貝 運行時 策略 import mic CP 使用 實例
一、類別的作用
1.聲明私有方法。
2.分解體積龐大的類文件。
3.把Framework私有方法公開。
二、類別的特點
1.運行時決議。
2.可以為系統類添加類別。(區別於擴展)
三、類別中可以添加什麽
1.實例方法。
2.類方法。
3.協議。
4.屬性。
類別並不是不可以擴展屬性的,只不過類別中不可以直接添加成員變量(實例變量)而已(第5點解決該問題)。
在類別中為屬性添加set/get方法,在set方法裏面賦值的時候找不到賦值的對象,也就是說系統沒有為我們生成帶下劃線的成員變量,沒生成我們就自己加,一加就報錯,這才是類別不能擴展屬性的根本原因。
5.實例變量(通過關聯對象可以添加)。
//UINavigationController+Cloudox.h文件 #import <UIKit/UIKit.h> @interface UINavigationController (Cloudox) @property (copy, nonatomic) NSString *cloudox; @end //UINavigationController+Cloudox.m文件 #import "UINavigationController+Cloudox.h" #import <objc/runtime.h> @implementation UINavigationController (Cloudox)//定義常量 必須是C語言字符串 static char *CloudoxKey = "CloudoxKey"; -(void)setCloudox:(NSString *)cloudox{ /* objc_AssociationPolicy參數使用的策略: OBJC_ASSOCIATION_ASSIGN; //assign策略 OBJC_ASSOCIATION_COPY_NONATOMIC; //copy策略 OBJC_ASSOCIATION_RETAIN_NONATOMIC; // retain策略 OBJC_ASSOCIATION_RETAIN; OBJC_ASSOCIATION_COPY;*/ /* 關聯方法: objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy); 參數: * id object 給哪個對象的屬性賦值 const void *key 屬性對應的key id value 設置屬性值為value objc_AssociationPolicy policy 使用的策略,是一個枚舉值,和copy,retain,assign是一樣的,手機開發一般都選擇NONATOMIC */ objc_setAssociatedObject(self, CloudoxKey, cloudox, OBJC_ASSOCIATION_COPY_NONATOMIC); } -(NSString *)cloudox{ return objc_getAssociatedObject(self, CloudoxKey); } @end
四、加載調用棧
以方法為例:分類數組裏有方法數組(二維數組),將類別方法拼接到原類的方法列表中實現如下:
1.總數 = 舊+新。
2.內存分配新總數(調整Array的存儲)。
3.設置新總數。
4.memmove操作(Array結構):【【】,【】,【】,【原有方法列表一】,【原油方法列表二】】。
5.memcpy內存拷貝(Array結構):【【新A類別方法列表】,【新B類別方法列表】,【新C類別方法列表】,【原有方法列表一】,【原油方法列表二】】。
註意1:同一個類的兩個分類有同名方法哪個生效?
答:最後編譯的分類的方法生效(原因:調取方法列表倒序調用)。
註意2:分類“覆蓋”(不是替換,方法都會保留)原有宿主類方法,由於分類方法被放到前面所以會出現這種情況,即分類方法優先被實現。
註意3:名字相同的分類會編譯報錯。
2-1 OC 類別(分類)