【发布时间】:2013-01-26 21:41:24
【问题描述】:
我想在单个块的多次调用中重用一个对象引用,我很好奇:以下两种方法之间的实际区别是什么?
使用__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;
}];
}
使用static 变量:
for(Gadget *gadget in self.gadgets) {
[self useGadget:gadget withCallback:^{
static Widget *widget;
if(!widget || [widget isBroken]) {
widget = [self buildNewWidget];
}
gadget.widget = widget;
}];
}
显然,这两个代码块从语义角度来看是不同的,但(实际上)我相信它们做的是相同的基本工作。我的猜测是,从内存管理角度、性能角度或其他角度来看是有区别的。任何能说明这些差异(或解释为什么它们没有不同)的见解都会有所帮助。
【问题讨论】:
-
现在不能输入完整的答案,但是如果你把它们放在一个将被多次调用的函数中,它们的行为会有所不同(前者每次都会创建一个新的小部件,后者不会)。
-
@jtbandes 我认为这不是真的;我很想看到更多关于你的意思的解释。基于实验,这两种实现都有效地“记住”了最后一个构建的小部件并保持引用直到调用下一个块。我错过了什么吗?
-
下一个块,是的——但封闭范围也很重要。
__block Widget *变量是局部范围的,但static Widget *是文件的全局变量(即使它在块外不可见)。 -
对不起,我现在明白你的意思了。这也是拉米回答他的方向。你是完全正确的——如果这是一个可以被多次调用的方法的两个实现,那么行为是非常不同的。好点子。
-
您的代码似乎假定为 ARC;值得明确说明。
标签: ios objective-c cocoa-touch cocoa