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,分類只能在執行時給類新增方法,不能新增例項變數,可以新增屬性,但新增的屬性沒有getter
和setter
,只有擴充套件(extension)能再編譯時給類新增方法、屬性、例項變數(都是私有的),有了runtime,可以使用關聯物件(associated object),為分類的屬性新增getter
和setter
,具體為:
// 為乙個例項物件新增乙個關聯物件,用鍵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時,同時加上...