我有一个涉及块的内存泄漏,我认为它与此相关 - 剥离 - 代码段。我认为问题是在我将tapCbk传递给scrollLayerItem之前,块定义超出了范围。
我想我可以在每个定义中复制块并在最后释放它,但这似乎容易出错。我宁愿保留开关,因为我在这些case块中做了更多的东西。我使用MRC。
有没有更好的方法来解决这个问题?
void (^tapCbk)(void) = nil;
switch (state)
{
case INVITED:
tapCbk =
^{
:
};
break;
case SOMETHING_OTHER:
tapCbk =
^{
:
};
break;
: // Lots of more cases, and a default
}
ScrollLayerItem *item = [ScrollLayerItem itemWithNode:scrollLayerItemNode
tapCbk:tapCbk];
答案 0 :(得分:0)
你必须复制你的块并自动释放它,然后再将它传递到创建它的函数之外:
tapCbk = [[tapCbk copy] autorelease];
或者,只需使用ARC。
答案 1 :(得分:0)
由块文字创建的块仅在块文字的本地范围的持续时间内有效。在这种情况下,这些块文字的局部范围是switch
语句的主体。将块存储在switch
语句正文之后使用的变量中,因此需要在块离开switch
语句的主体之前复制该块。
如果您没有switch
,而是在顶层创建了该块,例如void (^tapCbk)(void) = ^{ ... };
,那么你就不必复制它了。如果在这种情况下仍然有问题,那么+[ScrollLayerItem itemWithNode:tapCbk:tapCbk]
方法中存在问题。