Informationen zum Abrufen eines neuen NSManagedObject-Objekts

8

Ich beobachte die Core Data-Handbücher und es gibt zwei Möglichkeiten, um eine neue NSManagedObject-Instanz zu erhalten.

  • - initWithEntity: insertIntoManagedObjectContext: der NSManagedObject-Klasse
  • + insertneObjectForEntityForName: inManagedObjectContext: der NSEntityDescription-Klasse

Gibt es einen Unterschied zwischen beiden Methoden? Oder sie bedeuten nur dasselbe, um unter allen Bedingungen ein neues NSManagedObject zu erhalten.

    
AechoLiu 21.09.2010, 03:42
quelle

1 Antwort

7

Basierend auf dem, was in der Dokumentation gesagt wird, ist es möglich, die Klassenmethode von NSEntityDescription zu verwenden, um das NSManagedObject zu instanziieren, ohne den Header zu deklarieren / importieren. Indem Sie den Namen der Klasse festlegen, erhalten Sie eine "vollständig konfigurierte Instanz" des Objekts zurück.

Es ist nützlich in frühen Phasen der Entwicklung, wenn sich die Dinge ständig ändern, aber es kann ein Risikofaktor sein, da Sie keine Kompilierungsfehler oder Warnungen erhalten, wenn Sie den Namen Ihrer Klasse falsch schreiben, da es eine Zeichenfolge ist.

>

Die Methode von NSManagedObject benötigt die Schnittstelle der spezifischen Klasse, die in Ihre Datei importiert wurde, und macht sie robuster gegen Fehler, da der Compiler prüfen kann, ob diese Klasse existiert.

Zum Beispiel haben sie das gleiche Ergebnis, sie werden eine Instanz der angegebenen Klasse zurückgeben. Obwohl die Anzahl der Retains unterschiedlich sein wird:

- initWithEntity:insertIntoManagedObjectContext: (Zählung beibehalten == +1)

+ insertnewObjectForEntityForName:inManagedObjectContext: (Zählung beibehalten == 0)

Hier ist die Dokumentation

NSEntityDescription-Klassenreferenz ( insertNewObjectForEntityForName:inManagedObjectContext: )

  

Rückgabewert

     

Eine neue, automatisch freigegebene, vollständig konfigurierte Instanz der Klasse für die Entität mit dem Namen entityName. Die Entity-Beschreibung der Instanz wird festgelegt und in den Kontext eingefügt.

     

Diskussion

     

Diese Methode erleichtert das Erstellen von Instanzen einer bestimmten Entität, ohne sich um die Details der Erstellung von verwalteten Objekten kümmern zu müssen.

     

Die Methode ist besonders unter Mac OS X 10.4 nützlich, da Sie damit ein neues verwaltetes Objekt erstellen können, ohne die Klasse kennen zu müssen, die zur Darstellung der Entität verwendet wird. Dies ist besonders vorteilhaft früh im Entwicklungslebenszyklus, wenn Klassen und Klassennamen flüchtig sind.

     

Unter Mac OS X 10.5 und höher und unter iOS können Sie stattdessen initWithEntity verwenden: insertIntoManagedObjectContext: gibt eine Instanz der entsprechenden Klasse für die Entität zurück.

NSManagedObject-Klassenreferenz ( initWithEntity:insertIntoManagedObjectContext: )

  

Rückgabewert

     

Eine initialisierte Instanz der entsprechenden Klasse für die Entität.

     

Diskussion

     

NSManagedObject verwendet die dynamische Klassengenerierung zur Unterstützung des Objective-C 2-Eigenschaftenfeatures (siehe "Deklarierte Eigenschaften"), indem automatisch eine Unterklasse der Klasse entity.initWithEntity erstellt wird: insertIntoManagedObjectContext: gibt daher eine Instanz der entsprechenden Klasse für die Entität zurück . Die dynamisch generierte Unterklasse basiert auf der Klasse, die von der Entität angegeben wird. Die Angabe einer benutzerdefinierten Klasse in Ihrem Modell ersetzt die Klasse, die an die Zuordnung übergeben wurde.

     

Wenn der Kontext nicht null ist, ruft diese Methode [context insertObject: self] auf (wodurch wakeFromInsert aufgerufen wird).

     

Es wird davon abgeraten, diese Methode zu überschreiben - Sie sollten stattdessen watchFromInsert und / oder watchFromFetch überschreiben (wenn es für diese Methoden eine gemeinsame Logik gibt, sollte sie in eine dritte Methode einbezogen werden, die von beiden aufgerufen wird). Wenn Sie bei dieser Methode eine benutzerdefinierte Initialisierung durchführen, können Probleme beim Rückgängigmachen und Wiederholen auftreten.

     

In vielen Anwendungen ist es nicht erforderlich, ein neu erstelltes verwaltetes Objekt einem bestimmten Geschäft zuzuweisen (siehe assignObject: toPersistentStore:). Wenn Ihre Anwendung über mehrere Speicher verfügt und Sie einem bestimmten Speicher ein Objekt zuweisen müssen, sollten Sie dies nicht in der Initialisierungsmethode eines verwalteten Objekts tun. Eine solche Zuweisung ist Controller- und nicht Model-Level-Logik.

    
vfn 21.09.2010, 04:45
quelle