2013-04-02 72 views
2

我正在用CCSprites填充NSMutableArray並將它們添加到添加到場景的當前圖層中。當我嘗試訪問數組的元素,我得到一個壞的訪問錯誤與精靈數組訪問錯誤

sprites = [[[NSMutableArray alloc] init]autorelease]; 

    int j = 0; 

    for (int i=0; i<[sprites count]; i++) 
    { 
     j=i+1; 
     sprite = [CCSprite spriteWithFile:[NSString stringWithFormat:@"intro%d.png",j]]; 
     sprite.position = ccp(WIDTH/2, HEIGHT/2+(i*HEIGHT)); 
     [sprites addObject:sprite]; 

    } 

    for (int i = 0; i<[sprites count]; i++) 
    { 
     [self addChild:[sprites objectAtIndex:i]]; 
    } 


    [self scheduleUpdate]; 


} 
return self; 

這是在init方法完成,精靈和精靈在頭文件中聲明。在更新方法中,我有

sprite = [sprites objectAtIndex:1]; 
sprite.position = ccpAdd(sprite.position, ccp(0,dy)); 
CCSprite* spr = [sprites objectAtIndex:2]; 
spr.position = ccpAdd(spr.position, ccp(0,dy)); 

當控制傳遞給更新方法時,我得到一個錯誤的訪問。我會很高興如果有人能幫助我

+0

考慮使用ARC – LearnCocos2D

回答

0

發生這種情況是因爲您創建了autorelease對象,您稍後嘗試在更新代碼中訪問該對象。 sprites數組的保留計數爲零(因爲它是自動釋放),並且被取消分配,然後嘗試訪問它,並獲得錯誤訪問錯誤。

要修復,你應該而不是使sprites數組成爲一個autorelease對象。既然你打算在你的代碼中使用這個對象,你應該保留它(通過不添加autorelease)。你還應該確保釋放數組(無論操作數組的父對象)的dealloc方法。

- (void) dealloc { 
    [ sprites release ]; 
    [ super dealloc ]; 
} 
+0

非常感謝您的回答非常有幫助。我很感激。 – user2237439

0

你應該保留sprites數組(確保你釋放它在你的對象的dealloc)。由於它是可自動釋放的,因此在從初始化到更新方法的循環過程中,它會被釋放。另外(奇怪),如果你的代碼如圖所示,當你開始你的第一個循環時,sprites.count爲0。你不會在那裏得到很多:)。

0

其他是右側(autorelease電話是罪魁禍首 - 你應該刪除它,然後釋放陣列中的場景dealloc方法)。

還要注意的是[[[NSMutableArray alloc] init]autorelease]有作爲[NSMutableArray array]同樣的效果(您的方案,不過,這是不是你所需要的)。