美文网首页
iOS 循环引用的两种解法

iOS 循环引用的两种解法

作者: 杨柳小易 | 来源:发表于2017-05-17 00:00 被阅读34次

暂时只能想到两种,以后有想法了继续补充。
循环引用的概念就不讲了,这里只是讲讲在block中解除的方法。
第一种当然是使用<code>weak</code>了

此处主要记录第二种。直接在block中传入有可能引起循环引用的值作为参数,比如:

@class XXXSelfContrainSelf;
typedef void(^Test)();
@interface XXXSelfContrainSelf : NSObject

@property (nonatomic, strong) Test block;

- (void)test;

@end

@implementation XXXSelfContrainSelf

- (void)test {
    if (self.block) {
        self.block();
    }
}
- (void)dealloc {
    NSLog(@"11111");
}

@end

如果再调用的时候这样子调用就会引起循环引用,从而内存泄漏

XXXSelfContrainSelf *obj = [XXXSelfContrainSelf new];
    obj.block = ^(){
        [obj class];
    };

这个时候只要做一下小修改

typedef void(^Test)(XXXSelfContrainSelf *);

然后这样子调用,就解决了

XXXSelfContrainSelf *obj = [XXXSelfContrainSelf new];
    obj.block = ^(XXXSelfContrainSelf *wSelf){
        [wSelf class];
    };

跟人讨论时候,别说城投机取巧的方式,,我倒是觉得,如果只有一个变量引起循环引用,这种方式才是更好的,因为方便修改,方便测试!

还有一种方式在block调用完成之后,清空block,比如开源库 <code>PSTAlertController</code>中的<code>PSTAlertAction</code>

- (void)performAction {
    if (self.handler) {
        self.handler(self);
        self.handler = nil; // nil out after calling to break cycles.
    }
}

相关文章

网友评论

      本文标题:iOS 循环引用的两种解法

      本文链接:https://www.haomeiwen.com/subject/fvprxxtx.html