iOS的Runtime机制下给类别(category)添加属性、替换原有类的方法执行
一、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);
ForeverGuard博客园