一、Runtime的理解
OC是面向對象的語言這是常識,其實就是通過Runtime機制動態創建類和對象,這里只是簡單的運用runtime的使用!
二、類別(category)添加屬性_使用前記得導入頭文件#import <objc/runtime.h>
通過這三個方法動態的綁定屬性
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);//set方法
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key) OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);//get方法
OBJC_EXPORT void objc_removeAssociatedObjects(id object) OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);//移除
eg:
- (void)setName:(NSString *)name{ // OBJC_ASSOCIATION_ASSIGN = 0, //assign // OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //retaion , nonatomic // OBJC_ASSOCIATION_COPY_NONATOMIC = 3, //copy , nonatomic // OBJC_ASSOCIATION_RETAIN = 01401, //retain // OBJC_ASSOCIATION_COPY = 01403 //copy /** 實現set方法 @param object#> self description#> @param key#> 屬性的鍵值統一就行 description#> @param value#> 屬性的值 description#> @param policy#> 和copy,retain,assign類似 description#> */ objc_setAssociatedObject(self, nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC); } //定義常量 屬性的鍵值統一 static char *nameKey = "nameKey"; - (NSString *)name{ /** 實現get方法 @param object#> 這是填self description#> @param key#> 屬性的鍵值統一就行 description#> */ return objc_getAssociatedObject(self, nameKey);
三、兩個方法的執行替換
SEL originalSelector = NSSelectorFromString(@"原來方法名"); SEL swizzledSelector = NSSelectorFromString(@"需要替換的方法名"); Method originalMethod = class_getInstanceMethod([self class], originalSelector); Method swizzledMethod = class_getInstanceMethod([self class], swizzledSelector); method_exchangeImplementations(originalMethod, swizzledMethod);
