大佬教程收集整理的这篇文章主要介绍了ios – 在一个块中,__block变量和静态变量之间的实际区别是什么?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
使用__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; }]; }
显然,这两个代码块在语义上是不同的,但(实际上)我认为它们做的是同样的基本工作.我的猜测是,从内存管理角度,性能角度或其他方面来看,存在差异.任何说明这些差异的见解(或解释为什么它们没有区别)都会有所帮助.
假设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变量和静态变量之间的实际区别是什么?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。