ios – 在一个块中,__block变量和静态变量之间的实际区别是什么?

ios – 在一个块中,__block变量和静态变量之间的实际区别是什么?,第1张

概述我希望在单个块的多个调用中重用对象引用,我很好奇:以下两种方法之间的实际区别是什么? 使用__block变量: __block Widget *widget = [self buildNewWidget];for(Gadget *gadget in self.gadgets) { [self useGadget:gadget withCallback:^{ if([wi 我希望在单个块的多个调用中重用对象引用,我很好奇:以下两种方法之间的实际区别是什么?

使用__block变量:

__block Widget *Widget = [self buildNewWidget];for(Gadget *gadget in self.gadgets) {    [self useGadget:gadget withCallback:^{        if([Widget isbroken]) {            Widget = [self buildNewWidget];        }        gadget.Widget = Widget;    }];}

使用静态变量

for(Gadget *gadget in self.gadgets) {    [self useGadget:gadget withCallback:^{        static Widget *Widget;        if(!Widget || [Widget isbroken]) {            Widget = [self buildNewWidget];        }        gadget.Widget = Widget;    }];}

显然,这两个代码块在语义上是不同的,但(实际上)我认为它们做的是同样的基本工作.我的猜测是,从内存管理角度,性能角度或其他方面来看,存在差异.任何说明这些差异的见解(或解释为什么它们没有区别)都会有所帮助.

解决方法 出于本答案的目的,假设两个示例都包含在 – (voID)useGadgetsOnWidgets {…}中.

假设ARC,您的应用程序是单线程的,并且代码是不可重入的(即useGadgetsOnWidgets不调用自身),并且在方法返回后未使用该块,则有一个主要区别:

使用静态变量,Widget会永远存在.这意味着小部件可以在调用-useGadgetsOnWidgets(可能是好的和坏的)之间重用,但也意味着Widget会永久保留.你可以通过将小部件从循环/块中拉出来改变这一点(我在开始时也将它更加类似于__block版本:

-(voID)useGadgetsOnWidgets {  static Widget *Widget;  Widget = [self buildNewWidget];  for(Gadget *gadget in self.gadgets) {    [self useGadget:gadget withCallback:^{      if([Widget isbroken]) {        Widget = [self buildNewWidget];      }      gadget.Widget = Widget;    }];  }  Widget = nil;}

有一个第三个变体,它有点线程安全,并假设在方法返回后不使用该块:

-(voID)useGadgetsOnWidgets {  Widget *Widget = [self buildNewWidget];  Widget ** pWidget = &Widget;  for(Gadget *gadget in self.gadgets) {    [self useGadget:gadget withCallback:^{      if([*pWidget  isbroken]) {        *pWidget = [self buildNewWidget];      }      gadget.Widget = *pWidget ;    }];  }}

这看起来比使用静态变量(实际上只是一个全局变量)稍微好一些,但它仍然很蹩​​脚.也不是我想要给新手程序员教授的技术(但是再一次,也不是任何类型的多线程).

编辑:对于您描述的问题,比任何一个更好的解决方案是将窗口小部件缓存在自身的ivar / property中:

-(Widget*)workingWidget {  // Assuming _cachedWidget is an ivar  if ([_cachedWidget isbroken]) {    _cachedWidget = [self buildWidget];  }  return _cachedWidget;}-(voID)useGadgetsOnWidgets {  for(Gadget *gadget in self.gadgets) {    [self useGadget:gadget withCallback:^{      gadget.Widget = [self workingWidget];    }];  }}
总结

以上是内存溢出为你收集整理的ios – 在一个块中,__block变量和静态变量之间的实际区别是什么?全部内容,希望文章能够帮你解决ios – 在一个块中,__block变量和静态变量之间的实际区别是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1113656.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存