关于__block的一个疑问

问题描述

使用带block的构造方法,编译的时候出现警告:

clipboard.png

警告信息:Variable 'pointsRuleView' is uninitialized when captured by block

我百度后知道加上__block可以消除此警告:

clipboard.png

我想请教的是:__block在这里到底做了什么?

完整代码:https://github.com/CaiWanFeng...

阅读 4.1k
1 个回答

具体需要了解block 的捕获规则. 下面简单介绍一下, 可能不特别准确, 不过大概能明白就好.
第一个情况, 在block 捕获pointsRuleView 时, 由于此时, 还没有返回, 导致 pointsRuleView 的值未定义, block 捕获到的可能是nil, 所以编译器会给你警告.
第二个情况, 加入了__block 关键字, 在arc 的情况, 可以认为简单理解为将pointsRuleView 从局部变量提升为全局变量, block 中的 pointsRuleView 值就可以正常获取了.
以上只是简化的答案, 具体可以看看ios 进阶之类的书了解block 的实现细则.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏