如图第一次进来weakSelf有值,但是在weakSelf声明好了在这个方法走了一圈在回到这个block中就变成nil 了
__strong typeof(self) strongSelf = self;这个不是这么写么 而且如果baby不是自身的属性block也不需要用弱引用的 不会造成循环引用的
@interface Baby : NSObject
@property (nonatomic,copy) void (^block)(int param);
@end
@implementation Baby
@end
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
__weak typeof(self) weakself = self;
Baby *b = [Baby new];
[b setBlock:^(int param) {
NSLog(@"%@",weakself);
}];
b.block(5);
}
@end
不知道能不能等价, 这个是正常输出的。要么是block
有什么问题,或者不要只依赖 lldb
,确定过NSLog
输出也确实为 nil
了吧
这个不就正是Weak&Strong的奥妙之处吗?
在进入 Block 执行之前要保证 self 指向的对象没有被释放掉, block里面 __strong typeof(weakSelfl) strongSelf = weakSelf
, 声明了一个 strongSelf 变量,
如果此时, weakSelf 有值,在 block 内, strongSelf 强引用 self 指向的对象,直到 block 执行结束,strongSelf 释放掉强引用;
而此时, weakSelf = nil, 那肯定是没有值了。
所以你的问题就是 在执行 __strong typeof(weakSelfl) strongSelf = weakS与elf
这句代码之前, self 所指向的对象已经被释放掉了!
由于不知道你的具体代码,所以还有你自己去分析分析!