关于Block内部要不要使用weakSelf的几种情况

1.block是控制器的属性,如果block内部没有使用weakSelf将会造成内存泄露

self.testBlock = ^()
  {
      NSLog(@"%@",self.mapView);
  };
  self.testBlock();

2.当block不是self的属性时,block内部使用self也不会造成内存泄露

 TestBlock testBlock = ^()
  {
      NSLog(@"%@",self.mapView);
  };
[self test:testBlock];

3.当使用类方法有block作为参数使用时,block内部使用self也不会造成内存泄露

[WDNetwork testBlock:^(id responsObject) {

      NSLog(@"%@",self.mapView);
  }];

只有当block直接或间接的被self持有时,才需要weak self。如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。
准确的说,应该是假设 block被放在子线程中执行,而在执行过程中 self 在主线程被释放了。由于 weakSelf 是一个弱引用,因此会自动变成 nil。而在 KVO 中,会崩溃。

你可能感兴趣的:(关于Block内部要不要使用weakSelf的几种情况)