内存泄漏——可能是由于块超出范围
Memory leak — probably due to block out-of-scope
我有一个涉及块的内存泄漏,我认为它与这个被剥离的代码段有关。我认为问题是在我将 tapCbk 传递给 scrollLayerItem 之前,块定义超出了范围。
我想我可以在每个定义处复制块并在最后释放它,但这似乎容易出错。我宁愿保留开关,因为我在这些案例块中做了更多的事情。我使用 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];
你必须先复制你的块并自动释放它,然后再将它传递到创建它的函数之外:
tapCbk = [[tapCbk copy] autorelease];
或者,只使用 ARC。
由块文字创建的块仅在块文字的局部范围内有效。在这种情况下,那些块文字的本地范围是 switch
语句的主体。您将该块存储在 switch
语句主体之后使用的变量中,因此您需要在它离开 switch
语句主体之前复制该块。
如果您没有 switch
,而是在顶层创建块,例如void (^tapCbk)(void) = ^{ ... };
,那就不用复制了。如果在这种情况下您仍然有问题,那么您的 +[ScrollLayerItem itemWithNode:tapCbk:tapCbk]
方法有问题。
我有一个涉及块的内存泄漏,我认为它与这个被剥离的代码段有关。我认为问题是在我将 tapCbk 传递给 scrollLayerItem 之前,块定义超出了范围。
我想我可以在每个定义处复制块并在最后释放它,但这似乎容易出错。我宁愿保留开关,因为我在这些案例块中做了更多的事情。我使用 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];
你必须先复制你的块并自动释放它,然后再将它传递到创建它的函数之外:
tapCbk = [[tapCbk copy] autorelease];
或者,只使用 ARC。
由块文字创建的块仅在块文字的局部范围内有效。在这种情况下,那些块文字的本地范围是 switch
语句的主体。您将该块存储在 switch
语句主体之后使用的变量中,因此您需要在它离开 switch
语句主体之前复制该块。
如果您没有 switch
,而是在顶层创建块,例如void (^tapCbk)(void) = ^{ ... };
,那就不用复制了。如果在这种情况下您仍然有问题,那么您的 +[ScrollLayerItem itemWithNode:tapCbk:tapCbk]
方法有问题。