• block下循环引用的问题

    • __block本身并不能避免循环引用,避免循环引用需要在block内部把__block修饰的obj置为nil
    • __weak可以避免循环引用,但是其会导致外部对象释放了之后,block 内部也访问不到这个对象的问题,我们可以通过在 block 内部声明一个 __strong
      的变量来指向 weakObj,使外部对象既能在 block 内部保持住,又能避免循环引用的问题
  • __block与__weak功能上的区别。

    • __block会持有该对象,即使超出了该对象的作用域,该对象还是会存在的,直到block对象从堆上销毁;而__weak仅仅是将该对象赋值给weak对象,当该对象销毁时,weak对象将指向nil;
    • __block可以让block修改局部变量,而__weak不能。

另外,MRC中__block是不会引起retain;但在ARC中__block则会引起retain。所以ARC中应该使用__weak。

因此,__block和__weak修饰符的区别其实是挺明显的:
1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
4.__block对象在ARC下可能会导致循环引用,非ARC下会避免循环引用,__weak只在ARC下使用,可以避免循环引用。

作者:知乎用户
链接:https://www.zhihu.com/question/34593410/answer/59725212
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先,block中为什么会用到weakself是因为要避免循环引用,一旦出现循环引用那么对象就会常驻内存。如果一个应用程序里面你有很多循环引用,那么内存占用就会比较大,这当然是谁都不想看到的结果。那么问题的重点就是:什么时候会出现循环引用?先来看一个例子:

NSArray *anArray = @[@"1", @"2", @"3"]; [anArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [self doSomething:idx]; }]; 

这种情况下,block中retain了self,当block中的代码被执行完后,self就会被ARC释放。所以不需要处理weakself的情况。

再来看一个例子:

@interface aViewController ()
@property (nonatomic, strong) void(^aBlock)(id obj, NSUInteger idx, BOOL *stop); @end __weak aViewController *weakSelf = self; self.aBlock = ^(id obj, NSUInteger idx, BOOL *stop) { [weakSelf doSomething:idx]; } 

这个例子的区别在于:block被self strong引用。所以结果就是block中引用了self,self引用了block。那么这个时候,如果你不使用weakself,则self和block永远都不会被释放。

那么是不是遇到block都要使用weakself呢?当然不是,而且如果全部使用weakself,会出现你想执行block中的代码时,self已经被释放掉了的情况。

另外,在处理weakself时,有两种做法:__weak和__unsafe_unretained。两种做法各有推荐,有的人觉得后者从字面上更好理解,而有的人觉得前者更加安全,因为self被释放时会自动指向nil。有的人又说了,就是应该让app崩溃才能发现问题所在。这个,看个人吧。

转载于:https://www.cnblogs.com/sunjianfei/p/6688876.html

__block和__weak修饰符的区别相关推荐

  1. __weak 修饰符

    在 HAL 库中,很多回调函数前面使用__weak 修饰符,这里我们有必要给大家讲解__weak 修饰符的作用. weak 顾名思义是"弱"的意思,所以如果函数名称前面加上__we ...

  2. stm32_HAL库中__weak修饰符

    前言, 在 HAL 库中,很多回调函数前面使用__weak 修饰符. weak 顾名思义是"弱"的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为" ...

  3. iOS中assign和weak修饰符的区别

    一.区别 assign与weak,它们都是弱引用声明类型,最大的区别在那呢? 如果用weak声明的变量在栈中就会自动清空,赋值为nil. 如果用assign声明的变量在栈中可能不会自动赋值为nil,就 ...

  4. Java访问权限修饰符的区别

    Java有四种访问权限,其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符: private: Java语言中对访问权限限制的最窄的修饰符,一般称 ...

  5. 关于Kotlin修饰符internal和Java的默认修饰符的区别

    前言 在讲述问题前我们先了解下Java和Kotlin可见性修饰符. Java可见性修饰符public.protected.default(默认修饰符).private可见性如下: 修饰符\作用域 当前 ...

  6. Java 四种访问修饰符区别_四种访问修饰符的区别

    在Java编程语言中有四种权限访问控制符,这四种访问权限的控制符能够控制类中成员的可见性. 一.public (1)定义:public是公共的,被public所修饰的成员可以在任何类中都能被访问到. ...

  7. java中的权限修饰符_Java的权限修饰符的区别和用法总结

    类中的数据成员和成员函数据具有的访问权限包括:public.private.protect.friendly(包访问权限). 1.public:public表明该数据成员.成员函数是对所有用户开放的, ...

  8. c#中public/protect/private/internal修饰符的区别

    public 关键字是类型和类型成员的访问修饰符.公共访问是允许的最高访问级别,对访问公共成员没有限制. protected 关键字是一个成员访问修饰符.受保护成员在它的类中可访问并且可由派生类访问. ...

  9. Java中四种访问修饰符的区别

    在java中共有4种访问级别,按访问权限由高到低为:public(公有的).protected(受保护的).友好的(没有任何访问权限关键字修饰)和private(私有的). 类型 类内部 同一个包其他 ...

最新文章

  1. Hadoop之 MapReducer工作过程
  2. Pytorch optimizer.step() 和loss.backward()和scheduler.step()的关系与区别 (Pytorch 代码讲解)
  3. java对话框背景图片插入_关于java编程窗体加背景图片的问题
  4. Part2_1 Urllib的get请求和post请求
  5. Day-5: Python高级特性
  6. 鸟哥linux 私房菜
  7. 设置TDSAuthenticationManager属性对DataSnap服务端的接口授权
  8. Recyclerview 显示多种布局 demo
  9. php随机访问文章,zblog PHP调用热门文章、随机文章和热评文章代码
  10. 求二叉树左右子树高度差_LeetCode刷题实战110:平衡二叉树
  11. 通达信资金净流入公式_通达信资金净流量指标公式
  12. P2P业务整体流程图
  13. Microsoft Word 教程:如何在 Word 中插入图片、图标?
  14. 张家界 凤凰 旅游有感
  15. DateTime类型的12小时制与24小时制
  16. 高仿网易评论列表效果之界面分析
  17. php libevent 问题,安装讯搜xunsearch libevent时遇到的问题,如何解决?
  18. BMS总结(未完待续)
  19. RT-Thread 模拟器 simulator LVGL控件:switch 开关按钮控件
  20. 1060 搞笑世界杯

热门文章

  1. “全面二孩”效应消失,这十大原因导致“生不动”
  2. java facade dao_java – 在Facade模式中放置用于创建namedQuer...
  3. php向指定文件发送消息,PHP-将文件发送给用户
  4. sql用什么替代or
  5. 040_Tooltip文字提示
  6. 001_SpringMVC入门
  7. python中提供怎样的内置库、可以用来创建用户界面_Python程序设计案例课堂第二篇核心技术第十章图形用户界面...
  8. f12获取网页文本_怎么获取网页源代码中的文件?
  9. matlab fix函数_Matlab课后答案第四章
  10. fft的c语言和matlab对比_Matlab系列之程序控制