用runtime给类添加weak属性方式二

2018-09-29  本文已影响8人  杨七一

之前看到一个关于iOS的面试题,里面有一道题,问的是如何用runtime添加weak属性,而 @iOS程序犭袁 给出的参考答案,也有这个题的解决思路。
而另外一片简书文章里面有提供几种方式,但是文章描述比较混乱,方式也有一些小问题。

这篇文章主要提供另外一种简单讨巧的实现关联弱引用对象效果的方式,用一个NSPointerArray(弱引用类型的数组)来弱引用我们想要关联的对象,我们再对这个数组进行强引用关联,每次取值的时候,只需要从这个弱引用数组里面取就可以了。

1.用runtime给类添加NSPointerArrayproperty

#import "MUHostClass.h"
#import "MUValueClass.h"

@interface MUHostClass (Association)

@property (nonatomic, strong) NSPointerArray *valueObject;
@end
#import "MUHostClass+Association.h"
#import <objc/runtime.h>

@implementation MUHostClass (Association)

const static char kValueObject = '0';

- (void)setValueObject:(NSPointerArray *)valueObject {
    objc_setAssociatedObject(self, &kValueObject, valueObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSPointerArray *)valueObject {
    return objc_getAssociatedObject(self, &kValueObject);
}

@end

2.在main函数里面用自动释放池进行模拟打印

#import <Foundation/Foundation.h>
#import "MUHostClass+Association.h"


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MUHostClass *hostObj = [MUHostClass new];
        @autoreleasepool {
            MUValueClass *valueObj = [MUValueClass new];
            NSPointerArray *aa = [NSPointerArray weakObjectsPointerArray];
            //初始化一个弱引用数组对象
            
             [aa addPointer:(__bridge void * _Nullable)(valueObj)];
            //将对象添加进数组,NSPointerArray数组对MUValueClass对象进行弱引用.
            
            hostObj.valueObject = aa;
            //再将NSPointerArray数组赋值给runtime动态添加的属性。
            
            NSLog(@"%@", [hostObj.valueObject pointerAtIndex:0
                          ]);
        }
        NSLog(@"%@", [hostObj.valueObject pointerAtIndex:0]);
    }
    return 0;
}
打印结果
上一篇下一篇

猜你喜欢

热点阅读