OC Runtime 常見的應用

2021-10-10 05:40:32 字數 3473 閱讀 9213

oc runtime特性讓他具有一些新功能,可以應用在日常的工作中,下面介紹 runtime 中常見的應用,可以簡要總結為以下幾點(都要用到庫):

方法交換(method swizzle)

給分類(category)新增屬性

實現類的自動歸檔和自動解檔

實現字典轉模型

就是利用以下方法(來自庫):

// 獲得某個類的例項物件方法

method class_getinstancemethod(class cls , sel name)

// 獲得某個類的類方法

method class_getclassmethod(class cls , sel name)

// 交換兩個方法的實現

void method_exchangeimplementations(method m1 , method m2)

例子:

@inte***ce person : nsobject

- (void)speak;

- (void)run;

@end

@implementation person

- (void)speak

- (void)run

@end

person *person = [[person alloc] init];

method m1 = class_getinstancemethod([person class], @selector(speak));

method m2 = class_getinstancemethod([person class], @selector(run));

method_exchangeimplementations(m1, m2);

[person speak]; // -[person run]

[person run]; // -[person speak]

如果沒有runtime,分類只能在執行時給類新增方法,不能新增例項變數,可以新增屬性,但新增的屬性沒有gettersetter,只有擴充套件(extension)能再編譯時給類新增方法、屬性、例項變數(都是私有的),有了runtime,可以使用關聯物件(associated object),為分類的屬性新增gettersetter,具體為:

// 為乙個例項物件新增乙個關聯物件,用鍵key(字串)來區分(可以是乙個屬性的名稱),value為具體的關聯物件的值,policy為儲存策略(比如copy,strong等)

void objc_setassociatedobject(id object, const void *key, id value, objc_associationpolicy policy);

// 通過例項物件和key,獲取關聯物件的值

id objc_getassociatedobject(id object, const void *key);

// 刪除例項物件的關聯物件

void objc_removeassociatedobjects(id object);

// objc_associationpolicy的定義如下

typedef objc_enum(uintptr_t, objc_associationpolicy) ;

例子:

@inte***ce person (name)

@property(copy) nsstring *personmame;

@end

@implementation person (name)

-(void) setpersonmame:(nsstring *)personmame

-(nsstring *) personmame

@end

person *person = [[person alloc] init];

person.personmame = @"danny";

nslog(@"%@", person.personmame); // danny

要實現自動歸檔和解檔,需要知道乙個類的所有屬性名稱,在runtime中有如下實現方法:

// 獲得某個類的所有成員變數,返回在乙個列表中

ivar *class_copyivarlist(class cls , unsigned int *outcount)

// 獲得成員變數的名字

const char *ivar_getname(ivar v)

例子:

@inte***ce person : nsobject

@property (copy) nsstring *gender;

@property (assign) int age;

- (instancetype)initwithcoder:(nscoder *)adecoder;

- (void)encodewithcoder:(nscoder *)acoder;

@end

@implementation person

- (instancetype)initwithcoder:(nscoder *)adecoder

free(ivars);

}return self;

}- (void)encodewithcoder:(nscoder *)acoder

free(ivars);

}@end

int main(int argc, const char *ar**)

return 0;

}

遍歷模型的所有的屬性,再去字典中根據屬性名找對應值進行賦值

例子:

@inte***ce person : nsobject

@property (copy) nsstring *gender;

@property (assign) int age;

- (void)setdict:(nsdictionary *)dict;

@end

@implementation person

- (void)setdict:(nsdictionary *)dict

free(ivars);

c = [c superclass];

}}@end

int main(int argc, const char *ar**)

; [person setdict:dictionary];

nslog(@"%d", person.age); // 21

nslog(@"%@", person.gender); // male

}return 0;

}

常見的const應用

const定義變數後,該變數就沒有了寫許可權,只有讀許可權 1.const用於定義變數時,要進行初始化 例如 const int a 10 合法 const int a 非法 2.資料型別對於const而言是透明的 例如 const int a 10 等價於 int const a 10 const...

Filter常見應用

filter常見應用 l統一全站字元編碼的過濾器 通過配置引數encoding指明使用何種字元編碼,以處理html form請求引數的中文問題 public classcharsetencodingfilterimplementsfilter privatestring defaultcharset...

ffmpeg常見應用

參考 位元速率控制 ffmpeg如何控制位元速率?ffmpeg控制位元速率有3種引數選擇,minrate b v maxrate 這個操作把位元速率從原位元速率10mbps轉成2mbps位元速率,這樣其實也間接讓檔案變小了。目測接近一半。不過,ffmpeg官方wiki比較建議,設定b v時,同時加上...