0

コードからメモリ リークを取り除こうとして問題が発生しています。以下のコードでは、「configurationArray = [[NSArray arrayWithContentsOfFile:controllerConfigurationFilePath] preserve];」という行でメモリ リークが発生します。ただし、retain を削除するとアプリケーションがクラッシュし、retain を autorelease に変更するとクラッシュが発生します。

ありがとう、ウィリアム

 -(NSArray*)decodeConfigurationFile:(NSString*)fileName{
 NSArray* configurationArray = [[NSArray alloc] init];

 NSString *controllerConfigurationFilePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"];
 if (controllerConfigurationFilePath != nil) {
  // returns array of items storing the data for form 
  configurationArray = [[NSArray arrayWithContentsOfFile:controllerConfigurationFilePath] retain];
 }

 // returns fields dictionary objects from plist into an array
 return [[configurationArray objectAtIndex:0] objectForKey:@"fields"];
}
4

1 に答える 1

2

問題は、次のようにして配列を割り当てているようです

NSArray* configurationArray = [[NSArray alloc] init];

そして、次のようにして新しい配列を作成しています

configurationArray = [[NSArray arrayWithContentsOfFile:controllerConfigurationFilePath] retain];

作成した最初の配列を解放することはありません。最初の行はちょうど

NSArray* configurationArray = nil;

また、保持は必要ありません。これはローカル変数であり、その関数の範囲を超えてその配列へのポインターを保持していないためです。

クラッシュはおそらく、このメソッドを呼び出すオブジェクトが、このメソッドによって返されたオブジェクトを保持していない可能性があり、他に何も保持されていない場合、配列と共に割り当てが解除されるという事実から発生します。そのため、コード内の別の場所にあるそのオブジェクトにアクセスしようとすると、そのオブジェクトは存在しなくなります。呼び出し元のオブジェクトがこの返されたオブジェクトを保持する必要がある場合、呼び出し元のオブジェクトは返されたオブジェクトを保持する必要があります。

于 2010-09-03T15:19:25.407 に答える