2009-11-24 20 views
6

Ich habe eine Kerndatenklasse Spiel, die eine zu viele Beziehungen zu einem anderen Klasse Player hat. Dies ist, was ihre Header aussehenCore Data und Retain Cycles

@property (nonatomic, retain) NSSet * players; // In Game.h 
@property (nonatomic, retain) Game * game; // In Player.h (the inverse relationship) 

Als ich die letzte externe Referenz bin freisetzt, die ich auf die Spielklasse habe, wird didTurnIntoFault nicht genannt zu werden. Nun, meine Frage ist, dass dies auf die oben erstellte zyklische Referenz zurückzuführen sein könnte (Wie Sie sehen können, sind beide Eigenschaften 'behalten'), oder verwalten Kerndaten all das und das Problem ist irgendwo in meinem Code.

Antwort

4

Siehe Core Data Programming Guide: Memory Management (Breaking Relationship Retain Cycles).

Wenn Sie Beziehungen zwischen verwalteten Objekten haben, behält jedes Objekt eine starke Referenz auf das Objekt oder die Objekte bei, auf die es sich bezieht. In einer verwalteten Speicherumgebung führt dies zu Aufbewahrungszyklen (siehe Object Ownership and Disposal), die die Freigabe unerwünschter Objekte verhindern können. Um sicherzustellen, dass Aufbewahrungszyklen unterbrochen werden, können Sie nach Abschluss eines Objekts die Kontextmethode refreshObject:mergeChanges: des verwalteten Objekts verwenden, um daraus einen Fehler zu machen.

Normalerweise verwenden Sie refreshObject:mergeChanges:, um die Eigenschaftswerte eines verwalteten Objekts zu aktualisieren. Wenn das Flag mergeChangesYES ist, führt die Methode die Eigenschaftswerte des Objekts mit denen des Objekts zusammen, das im Persistent-Store-Koordinator verfügbar ist. Wenn das Flag jedoch NO ist, verwandelt die Methode ein Objekt einfach in einen Fehler, ohne dass es zusammengeführt wird. Dadurch werden verwandte verwaltete Objekte freigegeben. Dies unterbricht den Aufbewahrungszyklus zwischen dem verwalteten Objekt und den anderen verwalteten Objekten, die es beibehalten hat.

+0

Ich kann schwören, dass ich RTFM, aber das hat mich vermisst :) Danke trotzdem! – Manav

+2

Könnte ich hinzufügen, dass Sie dies rekursiv tun müssen, d. H. Brechen die Zyklen für ein verwaltetes Objekt NICHT automatisch bricht Zyklen, die die Kinder Objekte untereinander haben können – Manav