2013-07-17 104 views
1

在我UIViewContrller有一個下載塊的方法__block EXC_BAD_ACCESS:在塊調用self方法中?

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

現在,當我退出ViewContrller下載不完整。 當下載完成時,我的塊方法錯誤「[temp testMethod]; EXC_BAD_ACCESS」

回答

0

__block也意味着該對象不被塊保留。所以當你調用pop view controller然後試着打電話給testMethod時,你會發送一條消息給一個釋放對象。

可能的解決方案: - 保留視圖控制器,直到它完成下載處理(但是__block的字符串被正確寫入)。這種方式將工作,但似乎不正確。 - 使用通知而不是呼叫從塊的方法直接 - 使用另一個對象來處理下載的結果,例如任何單

0

從你的描述,我覺得你使用MRC因爲在MRC手段「自我」「__block」不會被阻止保留。當你退出視圖控制器時,'self'被釋放;當下載完成並且塊被調用時,'temp'將是一個懸掛指針。

如果你想確保下載完成時TestMethod的要執行,您應該使用:

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

否則,你可以改變你的文件是ARC,並使用下面的代碼:

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