我對塊和ARC的理解存在差距,我希望得到一些幫助。我收到了一個源自動畫完成塊的測試器的崩潰報告。碰撞如下:在ARC下的塊中聲明的對象的生命週期是多少?
異常類型:EXC_BAD_ACCESS(SIGSEGV)
異常代碼:KERN_INVALID_ADDRESS在0xf0000010
這是以下的動畫完成塊內發生(使用animateWithDuration:animations:completion:
)。我使用的臨時變量交換兩個視圖控制器:
{
[current wasMovedOffScreen];
PlayerViewController *temp = current;
current = next;
next = temp;
}
next = temp;
是其上發生崩潰的行。動畫的持續時間是0.3秒。
此代碼在視圖控制器內部執行,該視圖控制器充當兩個其他視圖控制器的容器,用於模擬用戶通過列表中的對象,如導航控制器,但具有一些定製控制器不適合我。
這兩個子視圖控制器被稱爲「當前」和「下一個」 - 您可以猜到當前控制器顯示當前內容,並且當用戶在列表中移動時,下一個用於在新項目中設置動畫。
如果我更改塊以便在執行中聲明temp
(與current
和next
一起),崩潰停止。然而,我不需要爲一個本地和臨時定義的東西舉辦一個階級ivar。
所以,
- 爲什麼
temp
顯然是由ARC在此過程中釋放? - 執行此操作的正確方法是什麼?是否有一些生命週期限定符應添加到塊實施中?
- 爲什麼我不能在自己的設備或模擬器上重現崩潰?這兩款設備都是iPhone 4運行相同版本的iOS(5.0.1)。
沒有貝塔斯參與,缺乏repro真的很煩我! – jrturton 2012-01-15 15:15:44