__weakSelf 和__strongSelf 为nil

图片说明

如图第一次进来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 所指向的对象已经被释放掉了!

由于不知道你的具体代码,所以还有你自己去分析分析!