您的位置:首页 > 移动开发 > IOS开发

iOS RunTime交换方法和给变量赋值的简单使用

2017-02-10 17:19 761 查看
在iOS可以用runtime做很多事,runtime赋予了oc面向对象开发的能力这里简单说一下runtime当程序调用一个不存在的方法的时候,系统会回调一些方法,这写方法可以帮助你处理因为调用不存在的方法而崩溃的问题。+ (BOOL)resolveClassMethod:(SEL)sel;+ (BOOL)resolveInstanceMethod:(SEL)sel;- (id)forwardingTargetForSelector:(SEL)aSelector;- (void)forwardInvocation:(NSInvocation *)anInvocation;第一个方法是当你调用一个不存在的类方法的时候,会调用这个方法,默认返回NO,你可以加上自己的处理然后返回YES第二个方法和第一个方法相似,只不过处理的是实例方法第三个方法是将你调用的不存在的方法重定向到一个其他声明了这个方法的类,只需要你返回一个有这个方法的target第四个方法是将你调用的不存在的方法打包成NSInvocation传给你。做完你自己的处理后,调用invokeWithTarget:方法让某个target触发这个方法关联对象现在你准备用一个系统的类,但是系统的类并不能满足你的需求,你需要额外添加一个属性。这种情况的一般解决办法就是继承。但是,只增加一个属性,就去继承一个类,总是觉得太麻烦类。这个时候,runtime的关联属性就发挥它的作用了static char associatedObjectKey;
objc_setAssociatedObject(target, &associatedObjectKey, @
"添加的字符串属性"
, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
NSString *string = objc_getAssociatedObject(target, &associatedObjectKey);
23b4cobjc_setAssociatedObject的四个参数:id object给谁设置关联对象。const void *key关联对象唯一的key,获取时会用到。id value关联对象。objc_AssociationPolicy关联策略,有以下几种策略:enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403 
};
其实,你还可以把添加和获取关联对象的方法写在你需要用到这个功能的类的类别中,方便使用。
- (void)addAssociatedObject:(id)object{
objc_setAssociatedObject(self, @selector(getAssociatedObject), object, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (id)getAssociatedObject{
return
 
objc_getAssociatedObject(self, _cmd);
[/code]
}
[/code]
注意:这里面我们把getAssociatedObject方法的地址作为唯一的key,_cmd代表当前调用方法的地址。
[/code]方法交换示例:
[/code]
[/code]
[/code]

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RunTime交换方法
相关文章推荐