iOS避免Block引起循环引用的标准处理方式

首先:

在工程的Prefix.pch的文件中直接(不推荐)或在其导入的头文件中间接写入以下宏定义:

 

//----------------------强弱引用----------------------

#ifndef weakify

    #if DEBUG

        #if __has_feature(objc_arc)

        #define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;

        #else

        #define weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object;

        #endif

    #else

        #if __has_feature(objc_arc)

        #define weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object;

        #else

        #define weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object;

        #endif

    #endif

#endif

 

#ifndef strongify

    #if DEBUG

        #if __has_feature(objc_arc)

        #define strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object;

        #else

        #define strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object;

        #endif

    #else

        #if __has_feature(objc_arc)

        #define strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object;

        #else

        #define strongify(object) try{} @finally{} __typeof__(object) object = block##_##object;

        #endif

    #endif

#endif

其次

在设置Block体的时候,像如下这样使用即可。

@weakify(self);
[footerView setClickFooterBlock:^{
        @strongify(self);
        [self handleClickFooterActionWithSectionTag:section];
}];

 

最后, 所有的Block里面的self必须要weak一下?

很显然答案不都是,有些情况下是可以直接使用self的,比如调用系统的方法:

[UIView animateWithDuration:0.5 animations:^{ NSLog(@"%@", self);
    }];

因为这个block存在于静态方法中,虽然block对self强引用着,但是self却不持有这个静态方法,所以完全可以在block内部使用self。

另外,来看一个Masonry代码布局的例子,这里面的self会不会造成循环引用呢?

[self.headView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.centerY.equalTo(self.otherView.mas_centerY);
}];

并不是 block 就一定会造成循环引用,是不是循环引用要看是不是相互持有强引用。block 里用到了 self,那 block 会保持一个 self 的引用,但是 self 并没有直接或者间接持有 block,所以不会造成循环引用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值