2012-02-13 7 views
2

私は同期ルーチンのiOS側をやっていますが、私は低メモリプロファイルを維持しようとしています。現在の自動解放プールが排水されていると、起動された障害はメモリから解放されますか?

  • NSManagedObjectバーNSManagedObjectのFooへ
    • 対多の関係(「fooMembers」)
  • NSManagedObjectのFoo
    • に-1:

      は、お母さんは、これらの2つのエンティティを持っていますNSManagedObject Barとの関係

    • NSString属性E「masterObjectID」
    • 他の多くの関係とATTRS

私がフェッチされているいくつかのバーのすべてfooMembersが保有するすべてのmasterObjectIDの文字列のコレクションを組み立てる必要があります。 これを行うには、私はバーのfooMembersを反復します。これは、すべてのフォールトのフォルトを発生させると仮定し、masterObjectIDを抽出してコレクションに追加します。

masterObjectID文字列は、あまりにも多くのメモリを占有するのではなく、冗長なメモリを占有します。

NSMutableSet *smsetExistingMemberIDs = [NSMutableSet setWithCapacity:[bar.fooMembers count]]; 

    NSAutoreleasePool *subpool = [[NSAutoreleasePool alloc] init]; // POOL 

    for (Foo *foo in bar.fooMembers) 
     [smsetExistingMemberIDs addObject:[foo.masterObjectID retain]]; // retain the string so that it will survive the drain 

    [subpool drain]; // DRAIN 

    // work with smsetExistingMemberIDs... 

だから私のソリューションは、masterObjectID文字列を保持が、私はそのプールを排出する際FOOSがメモリから解放されることを期待して、自動解放プールでのfoo-障害発射反復を囲むようにあります

しかし、私は正しいですか?フォールトを実行すると、実際にはNSManagedObjectが現在の自動解放プールに置かれますか?それとも、プールの宣言と無駄な排水はありますか?

答えて

1

Wienke、

は、最も簡単な答えは、あなたの自動解放プール内の別の管理対象オブジェクトコンテキスト(MOC)を作成することです。そうすれば、ループが終了したら、すべての項目を一度にパージすることができます。別のMOCを使用すると、変更をリッスンする必要がありますが、それはむしろ単純です。 Appleには、こうした種類の操作のためだけにプライベートMOCを表示するいくつかの例があります。

アンドリュー

+0

ありがとう。はい、この種のために別々の一時的なコンテキストを設定するのはかなり簡単でしょう。後でそれらを無効にすると、すべてのオブジェクトインスタンスがメモリから消去される場合は、よりよい方法のように聞こえるでしょう。しかし、私はあなたがなぜあなたのautorelease poolの中にいるのかと混同しています。私は一時的なコンテキストスキームを使用している場合、サブプールは必要ないと仮定しています。また、私はAppleの例をどこに見つけるのかヒントを与えてもらえますか?私は "コアデータを使ったメモリ管理"を見ましたが、それは何もリストしていません。 – Wienke

+0

ああ、OK。この例は、「効率的なデータのインポート」です。これは、別々のコンテキストとサブプールの両方を使用することを示唆しています。また、 'refreshObject:mergeChanges:'を呼び出すことによって、オブジェクトを再フォールトすることについても少しあります。すべての単一の 'foo'アクセスの後に私がそれをした場合、私はそこのメモリのほとんどを解放します。これは、私の心の中で、なぜAppleのドキュメントが、変更が行われたときにのみ、実際にテスト時に彼らが単にアクセス時に解雇されるように見えるときに、解雇されていることを指しているのかについて、何らかの混乱を残す。 – Wienke

+0

Wienke、あなたのプールを直接管理することが常にベストです。CDは非常に多くのオブジェクトを作成して、メモリの最高水準に大きな影響を与える可能性があります。 '-refreshObject:mergeChanges:'は、保持サイクルを中断するのに最も便利です。逆関係があるため、CDで作成するのは非常に簡単です。この方法には注意が必要です。標準アドバイスは '-save:'を呼び出す前に '-save:'を呼び出すことです。これにより、マージの例外やプロパティの上書きは発生しません。アンドリュー – adonoho