在我的UIViewContrller中有一个下载块方法
-(void)test
{
__block UIViewController *temp = self;
[[DownloadController sharedDownload] _complete:^{
[temp testMethod];
}];
}
现在,当我退出ViewContrller时,下载未完成。 下载完成后,我的块方法错误“[temp testMethod]; EXC_BAD_ACCESS”
答案 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];
}];
}