加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 编译器不将每个变量都视为__block变量的原因是什

发布时间:2020-12-14 19:22:11 所属栏目:百科 来源:网络整理
导读:编译器(特别是 Xcode使用的编译器)没有将每个变量都视为__block变量的性能提升有哪些?我想有必要有一些东西,我怀疑在__block变量的构思期间,它已经决定了 __block SelfClass * blockSelf = self; 是非常方便的语法. 解决方法 块的目标是使其尽可能自动且透
编译器(特别是 Xcode使用的编译器)没有将每个变量都视为__block变量的性能提升有哪些?我想有必要有一些东西,我怀疑在__block变量的构思期间,它已经决定了

__block SelfClass * blockSelf = self;

是非常方便的语法.

解决方法

块的目标是使其尽可能自动且透明,以使用具有最小语法的块并使它们“正常工作”.

非___块变量作为默认值,更符合块所代表的“闭包”的概念.在执行通过块声明时,块会快照块中引用的所有变量的状态.这包括复制内存/状态和保留块中捕获的任何Objective-C对象引用.

__block有效地打破了块内状态的封装.非常有用,但需要程序员手动管理对象引用.

即非___块变量“只是工作”更常见的__block变量,因此,默认行为是倾向于“正常工作”.

实际上,捕获块内状态的成本通常很小.对应用程序性能的可衡量影响通常很少,并且通常表明具有更深刻性质的架构问题.

如果通过:

__block SelfClass * blockSelf = self;

你指的是Blocks和ARC的交叉产品吗?是的,这有点不幸.但编译器也警告你需要注意一个非常现实的问题.但是,更清洁的解决方案显然更可取.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读