欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-04 13:56:51
...

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 中,会崩溃。