1

メインコンテキストからいくつかの子コンテキストを作成していますが、子コンテキストを解放する必要があるかどうかを知りたいですか?

子コンテキストを作成する CoreData クラスがあります (このクラスはアーク対応クラスです) が、アーク クラスではない他のクラスにコンテキストを提供できます。

- (NSManagedObjectContext *) createChildContext
{
    NSManagedObjectContext *childManagedContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    childManagedContext.parentContext = [self parentContext];
    return childManagedContext;
}

次に、他のクラスが子コンテキストを取得できます

NSManagedObjectContext *context = [coredata createChildContext];

私の質問は、このクラスでコンテキストを解放する必要があるか、それとも保持していないため、コンテキストを作成したアーク クラスによって自動管理されるかということです。

4

1 に答える 1

1

ARC と非 ARC を混在させているため、これは実際には非常に興味深い質問です。ただし、いつものように、メモリ管理ポリシーは、この状況で何をすべきかを決定するのに役立ちます。

最初に (すでにご存知だと思いますが)、コンテキストを作成する ARC クラス (内部-createChildContext) でコンテキストを解放する必要はありません。実際、クラスは ARC であるため、そこで明示的に解放または自動解放することはできません。内部で手動のメモリ管理を行うことはできません。

次に、呼び出しクラスを見てみましょう。あなたが書いたように、それが終わったらコンテキストを解放する必要はありません。コンテキストの所有権を取得していないため、オブジェクトを解放していることをオブジェクトに伝えるべきではありません。そもそも所有していなかったオブジェクトの所有権を放棄するのはあなたの立場ではありません。

コンテキストの所有権を取得していないのはなぜですか? まあ、あなたが書いているように、あなたは決して:

  • オブジェクトを明示的に保持 (例: [[coredata createChildContext] retain])
  • オブジェクトを@propertyマーク付きretainまたはstrong
  • allocnew、またはで始まるメソッドからオブジェクトを取得しましたcopy

この意味では、オブジェクトはそれを作成した ARC クラスによって「管理されている」と考えることができますが、これは少し誤解を招きます。実際には、誰がそれを管理するかは問題ではなく、非 ARC 呼び出しクラスでそれを所有していないことが重要です。

何らかの理由でそれを変更する必要がある場合 - たとえば、子コンテキストをしばらく保持する必要がある場合、またはクラス全体で使用する予定がある場合 - 上記のアプローチのいずれかを検討できます。コンテキスト。その場合、使い終わったらリリースする必要があります。

Advanced Memory Management Programming Guideを読むことを強くお勧めします。他のトピックの中でも特に、オブジェクトの所有権の取り扱いについて非常に役立つことがたくさんあります。

于 2012-10-19T16:49:05.663 に答える