1

私は長い間これと戦ってきました。Autorelease についての私の理解では、不要になったときに解放されるということです。

詳細なしでそれらの邪悪な EXC_BAD_ACCESS の 1 つを取得していました。次の場合にクラッシュします。

 int main(int argc, char *argv[])
 {
     @autoreleasepool {
         return UIApplicationMain(argc, argv, nil, NSStringFromClass([Logix_AppDelegate      class]));
     }
 }

Zombies を有効にすると、ループで CoreData に書き込んでいることがわかりました。これは NSManagedObjectContext の初期化です。

  NSManagedObjectContext *context = [[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext] autorelease];

ここに何か考えがあります....コードがたくさんあるので、ここに大量のものを貼り付けたくありませんでした。

4

1 に答える 1

2

autorelease現在の自動解放プールにオブジェクトを追加します。release現在の自動解放プールが破棄されると、そのオブジェクトはメッセージを受け取ります (そして、割り当てが解除される可能性があります)。

オブジェクトへの送信は、そのオブジェクトを所有autoreleaseしている場合にのみ意味があります。あなたの場合、メソッドの名前に「new」、「alloc」、または「copy」が含まれていないため、返されたオブジェクトを所有していないため、それを呼び出してはなりません。managedObjectContextautorelease

したがって、その行を次のように置き換える必要があります

NSManagedObjectContext *context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

『Advanced Memory Management Programming Guide』のメモリー管理ポリシーも参照してください。

自分
が作成したオブジェクトを所有する オブジェクトは、名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッド (たとえば、alloc、newObject、または mutableCopy) を使用して作成します。...

オブジェクトが不要になったら、所有しているオブジェクトの所有権を放棄する必要があります。オブジェクトの
所有権を放棄するには、オブジェクトにrelease メッセージまたはメッセージを送信しautoreleaseます。...

自分が所有していないオブジェクトの所有権を放棄してはなりません

于 2012-12-29T18:39:52.897 に答える