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

时间:2015-03-31 09:09:59

标签: objective-c objective-c-blocks

我有一个涉及块的内存泄漏,我认为它与此相关 - 剥离 - 代码段。我认为问题是在我将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];

2 个答案:

答案 0 :(得分:0)

你必须复制你的块并自动释放它,然后再将它传递到创建它的函数之外:

tapCbk = [[tapCbk copy] autorelease];

或者,只需使用ARC。

答案 1 :(得分:0)

由块文字创建的块仅在块文字的本地范围的持续时间内有效。在这种情况下,这些块文字的局部范围是switch语句的主体。将块存储在switch语句正文之后使用的变量中,因此需要在块离开switch语句的主体之前复制该块。

如果您没有switch,而是在顶层创建了该块,例如void (^tapCbk)(void) = ^{ ... };,那么你就不必复制它了。如果在这种情况下仍然有问题,那么+[ScrollLayerItem itemWithNode:tapCbk:tapCbk]方法中存在问题。