2011-06-22 9 views
0

plistから初期化されたNSStringを返そうとしています。目的C - NSString - メモリの基礎

私のリリースラインをコメントアウトすると、このコードが機能します。しかし、私はもはやそれらを必要としないので、メモリからこれらのオブジェクトを解放したいと思います。

私は 'initWithString'が目標文字列の内容を新しい文字列にコピーすると思っていました。つまり、安全にNSMutableArrayを解放することができました。しかし、そうではありません。何故なの?

+ (NSString*) genImage { 

NSString *path = [[NSBundle mainBundle] pathForResource: 
        @"Images" ofType:@"plist"]; 
NSMutableArray *arrayOfImages = [[NSMutableArray alloc] initWithContentsOfFile:path]; 

NSLog(@"%d", [arrayOfImages count]); 

int indexToLoad = 0; 

NSString *res = [[NSString alloc] initWithString:[arrayOfImages objectAtIndex:indexToLoad] ]; 

[arrayOfImages release]; 
[path release]; 
return res; 

}

答えて

2

あなたは-[NSBundle pathForResource:ofType:]path変数)の戻り値を保持していないので、それを解放する必要はありません(とそうすることは、クラッシュ、最も可能性の原因となります)。しかし、あなたはresをautoreleaseする必要があります。になります。最後の行を

return [res autorelease]; 
+0

に変更することができます。私は '* path'に 'alloc'を呼び出さなかったので、私はそれを解放してはいけません。 - はい? –

+1

@andy boot:基本的には。ドキュメントに別途記載されていない限り(非常に稀です)、名前に 'alloc'、' new'、または 'copy'を含まないメソッドがオートレリースされたオブジェクトを返すと仮定できます。 – mipadi

+0

私はあなたが*保持*オブジェクト(オートレリースされていない)を意味すると思います! – ipmcc