__block EXC_BAD_ACCESS:在块调用自我方法?

时间:2013-07-17 07:40:53

标签: block

在我的UIViewContrller中有一个下载块方法

-(void)test
{
    __block UIViewController *temp = self;
    [[DownloadController sharedDownload] _complete:^{
        [temp testMethod];
    }];
}

现在,当我退出ViewContrller时,下载未完成。 下载完成后,我的块方法错误“[temp testMethod]; EXC_BAD_ACCESS”

2 个答案:

答案 0 :(得分:0)

__block也表示此对象不会被块保留。因此,当您调用pop视图控制器然后尝试调用testMethod时,您会向已释放的对象发送消息。

可能的解决方案: - 保留视图控制器,直到完成下载处理(但正确写入__block的字符串)。这种方式可行,但似乎不正确。 - 使用通知而不是直接从块调用方法 - 使用另一个对象来处理下载结果,例如任何单例

答案 1 :(得分:0)

根据您的说明,我认为您正在使用MRC因为' __阻止'在MRC意味着自我'不会被块保留。当您退出视图控制器时,' self'被释放;当下载完成并且调用了块时,' temp'将是一个悬垂的指针。

如果你想确保在下载完成时应该执行testMethod,你应该使用:

-(void)test
{
    [[DownloadController sharedDownload] _complete:^{ 
        [self testMethod];
    }];
}

否则,您可以将文件更改为ARC,并使用以下代码:

-(void)test
{
    __weak UIViewController *temp = self;
    [[DownloadController sharedDownload] _complete:^{
       [temp testMethod];
    }];
}