3

NSManagedObjecta の内容を辞書に一時的に保存する必要があります。コア データには独自のメモリ管理手順があるため、 のフィールドへの強力なポインターを保持したくありませんNSManagedObject。この時点で重要なのは値のみです (値はビュー コントローラー間で渡され、MOC は異なります)。メモリの再利用がいつ行われるかを制御したいので、弱いポインタも作成できません。

私はいくつかのことを試しましたが、すべて失敗したか、目的に適合しませんでした。

  1. 重複[[myNSMO alloc] initWithEntity:[NSEntityDescription entityForName:entity inManagedObjectContext:myNSMO.managedObjectContext] insertIntoManagedObjectContext:nil]; しています動作していますが、私のアプリのデザインには適合しません (詳細には入りません)

  2. を使用してNSDictionaryから を生成します。NSManagedObject フィールドのアドレスを含む辞書を返すため、これは問題です。NSManagedObject[myNSMO dictionaryWithValuesForKeys:<#(NSArray *)#>]

  3. NSDictionaryこのように、copyWithZone を使用して各キー値を 入力する作成し[myDictionary setObject:[myNSMO.field copyWithZone:nil] forKey:@"Key"]; ますどちらも機能しません。まだフィールドアドレスを取得しています...

  4. [myDictionary setObject:[NSString stringWithFormat:@"%@",myNSMO.field ] forKey:@"Key"]; It's fine this time, I do get new memory allocation.で各フィールドを手動で入力します 。しかし、これを手動でコーディングするには非常に時間がかかります...

誰かがそれを行う賢い方法を見つけた可能性はありますか? オプション 1) が機能しなかった理由は、辞書をキューとして使用しているためです。最初にオブジェクトのコピーを保存し、必要に応じてエントリをポップアウトします。次に、その特定の辞書エントリのコピーが、要求元のメソッドに返されます。NSManagedObject問題は、を使用して作成されたのコピーを作成できないことです[[...] insertIntoManagedObjectContext:nil];

解決策はありますか?

4

1 に答える 1

9

ほとんどの意味で、管理対象オブジェクトのフィールドへの強力なポインタを保持することは安全です — リレーションシップは特別ですが、日付、文字列、および数値の実際の Foundation オブジェクトは、強力な参照がある場合にメモリに残る通常のオブジェクトです。

そうは言っても、エンティティのすべてのプロパティを含む辞書のコピーを作成するには、次のようにすることができます。

NSArray *properties = [[object entity] properties];
NSMutableDictionary *dictionaryRepresentation = [NSMutableDictionary dictionary];
for(NSAttributeDescription *attribute in properties)
{
    // we want only actual attributes, not relationships
    // or fetched properties
    if([attribute isKindOfClass:[NSAttributeDescription class]])
    {
        [dictionaryRepresentation
                 setObject:[object valueForKey:attribute.name]
                 forKey:attribute.name];
    }
}

したがって、管理対象オブジェクトがプロパティのリストを含むエンティティの説明を公開し、それらのプロパティを属性だけに絞り込み、キー値コーディングを使用して各プロパティの現在の値を取得し、最後にそれを挿入するという事実を使用しています。辞書に。

なんらかの理由でプロパティのコピーが必要な場合は (ただし、そうする理由はまったくありません)、ディクショナリに挿入するときに各プロパティを使用しますcopy( ARC を使用していない場合)。autorelease

于 2012-12-10T04:20:29.273 に答える