我有一款遊戲是用iOS7中的新SpriteKit編寫的。我有一個自定義的SKSpriteNode
可以獲取並顯示Facebook個人資料圖片。但是,因爲加載圖片可能需要一些時間。當我初始化節點並僅在圖片加載時顯示它時,我試圖在後臺加載圖片。這裏是我寫的代碼片段:EXC_BAD_ACCESS當在dispatch_async中使用「釋放」self時
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Code to load Facebook Profile picture
// ...
SKSpriteNode *fbFrame = [SKSpriteNode spriteNodeWithTexture:facebookPicTexture];
dispatch_async(dispatch_get_main_queue(), ^{
// self is my customised SKSpriteNode - so here I just add a sprite node of
// a facebook picture to myself as a child
[self addChild:fbFrame];
});
});
它正常工作正常。但是,如果Facebook配置文件圖片的加載速度較慢,則在加載圖片時,用戶可能已經切換到另一個屏幕。在這種情況下,self
實際上將從場景層次結構中移除,並且不會參考它。
當我讀取塊doc時,我認爲異步塊將保留self
,所以我認爲它在主線程塊被調用時仍然有效。事實證明,如果pic加載非常慢,並且在從層次結構中刪除self時調用了第二個dispatch_async,則會在行[self addChild:fbFrame]
處發生錯誤的訪問錯誤。
我理解塊存儲器管理不正確嗎?有沒有辦法解決這種問題?
「如果圖片加載速度非常慢,並且在自我從層次結構中移除時調用第二個dispatch_async,則會在行[self addChild:fbFrame]處發生錯誤的訪問錯誤。」如果從層次結構中刪除「self」,爲什麼會出現訪問不良的情況。這是沒有意義的部分。只要'self'指向一個有效的對象(這裏保證),發送消息不應該崩潰。 – newacct