首页 > 代码库 > iOS的Runtime机制下给类别(category)添加属性、替换原有类的方法执行
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);
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #e44448 } span.s1 { color: #d28f5a } span.s2 { }</style>
iOS的Runtime机制下给类别(category)添加属性、替换原有类的方法执行
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。