2011-07-27 21 views
4

我正在使用cocos2d填充一個NSMutable數組,然後從該數組創建一個NSArray。我使用不同的數組名稱連續3次執行以下代碼,並且第三次使用Instruments將報告每個添加到數組的元素的泄漏。如何在Objective C中創建和填充NSArray有什麼問題?

奇怪的是,它不是每次創建和添加CCSprite時,它每次運行應用程序時所抱怨的行都不一樣。我究竟做錯了什麼?有沒有更好的方法來做到這一點?

這裏是我的代碼:

NSMutableArray *tempNumberArray = [[NSMutableArray alloc] init]; 

tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"]; 
[tempNumberArray addObject:tempSprite]; 
[tempSprite release]; 
tempSprite = nil; 


tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"]; 
[tempNumberArray addObject:tempSprite]; 
[tempSprite release]; 
tempSprite = nil; 

tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"]; 
[tempNumberArray addObject:tempSprite]; 
[tempSprite release]; 
tempSprite = nil; 

tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"]; 
[tempNumberArray addObject:tempSprite]; 
[tempSprite release]; 
tempSprite = nil; 

self.numbersArray = [NSArray arrayWithArray:tempNumberArray]; 
[tempNumberArray release]; 
tempNumberArray = nil; 

編輯:感謝您抽空看看這個。 我第一次使用tempSprite我初始化它像:

CCSprite * tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"]; 
[tempNumberArray addObject:tempSprite]; 
[tempSprite release]; 
tempSprite = nil; 

我釋放每個分配之間tempSprite,因爲這將是一個泄漏,否則。 [tempNumberArray addObject:tempSprite]保留了精靈對象。

+1

什麼的'tempSprite'初始化代碼? –

+0

你爲什麼要釋放你的tempSprites?如果你已經發布了它們,它們不會進入你的陣列。 – Luke

+1

@Luke:數組保留添加的對象。釋放用alloc創建的對象是正確的,以便在指針被重用時不泄漏。 –

回答

1

我不知道你爲什麼看到泄漏。您發佈的代碼是正確的,但不必每次都將tempSprite設置爲nil;如果您有機會使用指針嘗試在釋放對象後發送消息,您只需要這樣做。不過,它並沒有傷害任何東西。

唯一的改善,我可以建議是做陣列建設一個循環:

// You can also use an autoreleased mutable array, since you don't need it 
// to stick around after construction. 
NSMutableArray * tempNumbersArray = [NSMutableArray array]; 
int i; 
for(i = 0; i < NUM_OF_SPRITES; i++){ 
    CCSprite * tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"]; 
    [tempNumbersArray addObject:tempSprite]; 
    [tempSprite release]; 
} 

self.numbersArray = [NSArray arrayWithArray:tempNumbersArray]; 
+0

感謝您使用for循環清理代碼的建議。這很有道理,我想我會這麼做!我必須在我的代碼的其他地方查看我收到的錯誤。 – Denin

相關問題