1. 程式人生 > >2-1 OC 類別(分類)

2-1 OC 類別(分類)

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 類別(分類)