2010-11-18 3 views
0

私がすることで、複数のメモリリークを作成してください:一連の[array addObject:[[NSNumber alloc] initWithBool:someVariable]?];によってメモリリークが発生しましたか?

NSMutableArray *array=[[NSMutableArray alloc] init]; 
[array addObject:[[NSNumber alloc] initWithBool:boolVariable1]]; 
[array addObject:[[NSNumber alloc] initWithBool:boolVariable2]]; 
[array addObject:[[NSNumber alloc] initWithInt:intVariable]]; 
[array addObject:[[NSNumber alloc] initWithFloat:floatVariable]]; 
[array writeToFile:[self dataFilePath] atomically:YES]; 
[array release]; 

は、それが使用することをお勧めし:

[array addObject:[NSNumber numberWithInt:intVariable]]; 
+0

"良い"は "間違っていない"を意味する場合は、はい:-) –

答えて

5

ruleは単純です:あなたはalloc/new/copy*/retain呼び出すたび、あなたはバランスをとる必要がありますそれはauto-/releaseへの呼び出しで、それ以外の場合はメモリリークが発生しています。コードサンプルではallocNSNumberに4回送信しますが、対応するリリースはないため、NSNumberの4つが漏れます。

numberWithInt:は、newないallocretaincopyで始まらないので、それはauto-/releaseへの呼び出しでバランスする必要はありません。

find memory leaksに使用できるツールがいくつかあります(Instrumentsなど)。

+0

ありがとうございました。 –

2

[NSNumber numberWithInt:intVariable] 

への呼び出しはそうそう、あなたが与えた例では、-numberWithInt:を使用する方が簡単だろう

[[[NSNumber alloc] initWithInt:intVariable] autorelease] 

と概念的に等価です。

NSMutableArray *array=[[NSMutableArray alloc] init]; 
[array addObject:[NSNumber numberWithBool:boolVariable1]]; 
[array addObject:[NSNumber numberWithWithBool:boolVariable2]]; 
[array addObject:[NSNumber numberWithInt:intVariable]]; 
[array addObject:[NSNumber numberWithFloat:floatVariable]]; 
[array writeToFile:[self dataFilePath] atomically:YES]; 
[array release]; 

そうしないと、配列に渡された各引数に-autoreleaseの呼び出しを追加する必要があると思います。

+0

ありがとうございます。 –

関連する問題