2011-01-16 7 views
1

私のコードでは、私は5セットのオブジェクトとそれらのオブジェクトを含む5 NSArraysを作成しています。私の方法の終わりに、2つの配列が適切に解放されますが、他の3つはアプリケーションをクラッシュさせます。NSArrayリリースクラッシュ

[name0 release]; 
[nameArray release]; //Releases properly 

[image0 release]; 
[imageArray release]; //Releases properly 

[price0 release]; 
NSLog(@"%i",[priceArray retainCount]); //Returns 1 
[priceArray release]; //Source of the crash 

[round0 release]; 
[roundArray release]; //Also crashes 

[priceRound0 release]; 
[priceRoundArray release]; //Also Crashes 

誰が正しくNSNumbersを含む配列を解放する方法を知って解放

UIImageView *image0 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"TankAxe.png"]]; 
NSArray *imageArray = [[NSArray alloc] initWithObjects:image0, nil]; 

NSString *name0 = [NSString stringWithString:@"Pistol"]; 
NSArray *nameArray = [[NSArray alloc] initWithObjects:name0, nil]; 

NSNumber *price0 = [NSNumber numberWithInt:100]; 
NSArray *priceArray = [[NSArray alloc] initWithObjects:price0, nil]; 

NSNumber *round0 = [NSNumber numberWithInt:0]; 
NSArray *roundArray = [[NSArray alloc] initWithObjects:round0, nil]; 

NSNumber *priceRound0 = [NSNumber numberWithInt:0]; 
NSArray *priceRoundArray = [[NSArray alloc] initWithObjects:priceRound0, nil]; 

を作成しますか?

+0

retainCountは、あなたがそのメソッドを呼び出すことはありません多くの理由の0つを返すことはできませんので注意してください。 – bbum

+0

実際には、保持カウントが0でメソッドが呼び出されると、アプリケーションがクラッシュし、メソッドを呼び出すためのデバッグに役立ちます。 –

答えて

1

price0、name0、round0、priceRound0はリリースしないでください。それらはallocで作成されたものではなく、それらを返すメソッドによってオートリリースされます。

オブジェクトを解放すると、ヒープが破損し、プログラムがいつでもクラッシュする可能性があります。

これをデバッグするための最も簡単な方法は、ゾンビをオンにすることです(ヒント#1):

http://www.loufranco.com/blog/files/debugging-memory-iphone.html

+0

ありがとうございます。あなたは私を救いました。 –