私は長い間この同じ問題を見つめていて、本当に助けや提案を感謝しています。私は何かシンプルだと確信していますが、私はそれを見つけることができません。私のアプリのデリゲートで、私は次のコードで(NSCopyingをサポートして私が作成したオブジェクトを、)アクセサリーオブジェクトの束をアップロードしています:iPhone SDKのmem管理の問題 - EXC_BAD_ACCESS
NSString *path = [[NSBundle mainBundle] pathForResource:@"Accessories" ofType:@"plist"];
NSDictionary *accDict = [[NSDictionary alloc] initWithContentsOfFile:path];
self.colors = (NSArray *) [accDict objectForKey:@"Colors"];
self.exteriorAccessories = [self loadAccessoriesForMode:EXTERIOR_MODE withDictionary:accDict];
self.interiorAccessories = [self loadAccessoriesForMode:INTERIOR_MODE withDictionary:accDict];
[accDict release];
そして、これは、メソッドの呼び出しの定義は次のとおりです。
-(NSArray *)loadAccessoriesForMode:(NSString *)mode withDictionary:(NSDictionary *) dictionary
{
NSMutableArray *tempValues = [[NSMutableArray alloc] init];
for (NSDictionary *value in [dictionary objectForKey:mode])
{
Accessory *accessory = [[Accessory alloc] initWithDictionary:value];
[tempValues addObject:accessory];
[accessory release];
}
NSArray *returnArray = [[NSArray alloc] initWithArray:tempValues copyItems:YES];
[tempValues release];
[returnArray autorelease];
return returnArray;
}
私がaccDictのリリースを取得したとき、私はEXC_BAD_ACCESS
の例外を受け取ります。ループ内のアクセサリーのリリースを取り除くと、すべてが問題ありませんが、私はAccessoryオブジェクトを漏らしています(私はそれを初期化して割り当てます。
これをデバッガでステップ実行すると、init、copy、およびdeallocメソッドがすべてアクセサリオブジェクトに期待通りに起動するのが見えます。アクセサリーオブジェクトのコードを投稿することもできますが、それが役に立ちそうだと思うのですが、問題はこのコードのどこかにあると思います。
それは、プロパティ「値」はそのアクセサメソッドで何が起こっているかに定義され方法を知っておくことが重要ですの。そこに保持され、リリースされていますか? –
はい、値は(非原子、保持)を持つプロパティです。だから私の感心したのは、 "value ="を呼び出すことで、その呼び出しがretainを呼び出すようにポインタを設定するのに対し、 "self.value ="は適切なセッターメソッドを呼び出してretainを呼び出すことでした。 – Bdebeez