高级宏定义
#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的生命)。