一种objc的runtime的弱引用实现方式

2019-02-21  本文已影响0人  幻影形風

问题:如何动态的给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来实现弱引用属性变量的过程。

上一篇下一篇

猜你喜欢

热点阅读