内存泄漏——可能是由于块超出范围

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] 方法有问题。