1

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

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

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

4

2 回答 2

0

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

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

于 2014-09-01T09:20:42.340 回答
0

根据您的描述,我认为您正在使用 MRC,因为 MRC 中的 '__block' 意味着 'self' 不会被块保留。当你退出视图控制器时,'self' 被释放;当下载完成并调用块时,'temp' 将是一个悬空指针。

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

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

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

-(void)test
{
    __weak UIViewController *temp = self;
    [[DownloadController sharedDownload] _complete:^{
       [temp testMethod];
    }];
}
于 2015-07-22T09:45:06.770 回答