gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 04:44:24 25 4
gpt4 key购买 nike

我想在单个 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;
}];
}

很明显,这两段代码从语义的角度来看是不同的,但(实际上)我相信它们做了相同的基本工作。我的猜测是,从内存管理角度、性能角度或其他角度来看,存在差异。任何说明这些差异(或解释为什么它们没有差异)的见解都会有所帮助。

最佳答案

一个例子胜过一千个字:

(是的,这是一个非常简单的示例,但它基本上等同于您正在做的...)

for (int i = 0; i < 3; i++)
{
// Your example encompasses this scope,
// not taking into account that we may execute this code multiple times:

// Call the block
(^{
// Every instance/execution of this block will have the same object.
static Obj *o;

// Initialize static object
static dispatch_once_t once;
dispatch_once(&once, ^{
o = [Obj new];
});

NSLog(@"Object is: %@", o);
})();
}
// Output:
// Object is: <Obj: 0x100109fd0>
// Object is: <Obj: 0x100109fd0>
// Object is: <Obj: 0x100109fd0>

for (int i = 0; i < 3; i++)
{
__block Obj *o = [Obj new];

// Call the block
(^{
// This block uses the object from its enclosing scope, which may be different.
NSLog(@"Object is: %@", o);
})();
}
// Output:
// Object is: <Obj: 0x105100420>
// Object is: <Obj: 0x1003004f0>
// Object is: <Obj: 0x105300000>

关于ios - 在一个 block 中,__block 变量和静态变量之间的实际区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14541865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com