2011-06-14 50 views
1

我有一個十個精靈的陣列;他們都坐在屏幕的同一區域爲了便於解釋,我會說在中下方,堆疊在一起。我需要做的是拿頂尖精靈,並通過向前滑動屏幕(從下到上)將其扔出屏幕。當我有一個精靈時,我沒有這個問題;這是當我有多個精靈,我有問題。我想補充的項目層像這樣:精靈的NSMutableArray,內存問題?

for(int i=0; i<maxCount; i++){ 
    CCSprite *x = [listOfItems objectAtIndex:i]; 

    //NSLog(@"(%f, %f)", x.position.x, x.position.y); 

    [self addChild:x]; 
} 

他們是在一個以上步驟中創建:

for (int i=0; i<maxCount; i++) { 
    CCSprite *o = [CCSprite spriteWithFile:@"image.png"]; 
    o.position = ccp(windowSize.width/2,windowSize.width/2); 

    [listOfItems addObject:o]; 

    [o release]; 
} 

我想,真正的問題是我不知道如何處理 「當前「 最佳。所以,如果我有數組索引0作爲頂部,我可以繼續並使用觸摸手勢並將其「彈出」屏幕。第一個工作正常,但是一旦我觸及第二個,它就會與EXC_BAD_ACCESS一起崩潰。這裏的方法的touchesBegan:

-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:[touch view]]; 
    location = [[CCDirector sharedDirector] convertToGL:location]; 
    startingPoint = location; 

    //Trying something here.... 
    //if(current) 
    // [current release]; 

    current = [listOfItems objectAtIndex:currentPosition]; 
    [self reorderChild:current z:2]; 

    actionStartTime = [NSDate timeIntervalSinceReferenceDate]; 
} 

當「這裏嘗試一些......」線是未加註釋,這也正是崩潰發生,當他們被註釋掉,將其分配current時發生。我知道我在這裏錯過了一些東西,但我無法弄清楚。

回答

1

如果您的對象都添加到數組中,我發現最簡單的方法是爲每個對象設置不同的標記。

for(int i = 0; i < NUMOFOBJECTS; i++) 
{ 
    CCSprite *sprite = blah blah whatever; 

    // I do something like 100+i so that each time I want to 
    // create different types of objects I can subtract the "100" 
    // or whatever it is to get a base index value for arrays. 
    sprite.tag = 100+i; 
} 

裏面你CCTouchesBegan你檢查觸摸,以確保它是在項目,然後你通過你的項目重複出現並使用正確的標籤僅移動項目。

for(CCSprite *sprite in objects) 
{ 
    if(sprite.tag - 100 == [objectOrderList objectAtIndex:0].tag) 
    { 
      // Do whatever 
    } 
} 

把它當作僞代碼,因爲我只是在寫我的頭頂。在這種情況下,您可以跟蹤NSMutableArray中的對象順序,每次更改順序時移除/替換/添加對象。

+0

正是我需要的!謝謝一堆。 – SlackerCoder 2011-06-16 01:25:29

1

一點就是刪除[o release]; CCSprites被創建爲自動釋放對象。

此外,要找到崩潰的原因,請嘗試打開運行菜單下的調試控制檯。控制檯中的最後一件事情通常會顯示錯誤發生的原因。

1

看看你如何設置current - 它被設置爲[listOfItems objectAtIndex:currentPosition],這是你不擁有的對象。因此,在下一次全面的情況下,該對象可能已被釋放,並且一旦釋放該對象(包括release),就會向其發送任何消息,這是未定義的行爲,如果幸運的話,將導致EXC_BAD_ACCESS。 (如果運氣不好,它可能會導致更微妙和更難以捕捉的錯誤。)