block 和 self 的故事 weakSelf,strongSelf 宏高级定义

8 篇文章 0 订阅

高级宏定义

#define AYWeakObj(o) autoreleasepool{} __weak typeof(o) o##Weak = o 

用法:
- (void)loadMoreDataAY
{
    @AYWeakObj(self);
    if ([self.delegate respondsToSelector:@selector(loadMoreData:)]){
        [self.delegate loadMoreData:^(NSArray<AYRecordDateModel *> *Arr) {
                selfWeak.listArr = Arr;
        }];
    }
}


strongSelf  和  weakSelf 混合使用
#define WeakObject(obj) __weak typeof(obj) weakObject = obj;
#define StrongObject(obj) __strong typeof(obj) strongObject = weakObject;

WeakObject(self);
loginVC.loginFinished = ^(){
   StrongObject(self)
   [strongObject doSomeThing];
   [strongObject doSomeThingElse];
};

首先UIKit的动画是不需要声明__weak的
UIView 的某个负责动画的对象持有了 block block 持有了 self
因为 self 并不持有 block,所以就没有循环引用产生,因为就不需要使用 weak self 了

[UIView animateWithDuration:0.2 animations:^{
    self.alpha = 1;
}];

从__weak的实现上也能知道使用__weak是有开销的。

strongSelf
由于weak指针随时都有可能被置为nil,如果当block中使用了多个self,如下

__weak __typeof(self) weakSelf = self;
self.block = ^{
    [weakSelf doSomething1];
    [weakSelf doSomething2];     
}

在执行完doSomething1时,weakSelf有可能被置为nil,结果导致doSomething2没有执行,这种执行了一半的情况当然不是我们愿意看到的,所以在block内我们再对weakSelf产生一个强引用,来保证在block结束之前,weakSelf不会被释放。

__weak __typeof(self) weakSelf = self;
self.block = ^{
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    if (strongSelf) {
        [strongSelf doSomethingWithData:data];
        [strongSelf doSomethingWithData:data];
    }     
}

strongSelf不会造成循环引用,因为没有对self持有(其实是block代码期间持有了,执行完毕就不持有了);block里的代码一定会执行,因为strongSelf会保证在block代码执行完毕之前self不会被释放(延迟了VC的生命周期),并且执行的时候strongSelf一定不会为nil。所以没有问题。

1.weakSelf,不增加self的引用计数,然后你还可以使用它,所以它能防止循环引用(该释放释放,和weakSelf怎么用完全没关系)。
2.strongSelf,在定义的区域内保证指向的内容不被释放,所以他用在确保代码执行的时候。(防止self变成nil,延迟self的生命)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值