一种objc的runtime的弱引用实现方式
问题:如何动态的给oc对象添加weak属性的变量?
现状:
objc的runtime仅支持assign,strong,copy,retain。所以得从其他方面进行处理。
解决:
可以通过以下方式:
首先定义个弱引用类容器,持有某变量的弱引用。
@interfaceWeakContainer :NSObject
@property(nonatomic,weak)id weakObject;
@end
其次在runtime里面实现,用弱引用类容器对象做中间变量来传值。
接口:
@interfaceSomeObject(Addtion)
@property(nonatomic,weak)NSNumber * item;
@end
实现:
#import "SomeObject+Addtion.h"
#import "WeakContainer.h"
@implementationSomeObject(Addtion)
- (void)setItem:(NSNumber*)item
{
WeakContainer * container = [[WeakContainer alloc] init];
container.weakObject= item;
objc_setAssociatedObject(self, @selector(item), container, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSNumber*)item
{
WeakContainer* container =objc_getAssociatedObject(self,@selector(item));
returncontainer.weakObject;
}
@end
以上就实现了一个通过rumtime来实现弱引用属性变量的过程。