2009-11-24 11 views
6

Posiadam podstawową grę klasy danych, która ma wiele relacji z innymi graczami z klasy. To, co ich nagłówki wyglądaćDane podstawowe i cykle zatrzymania

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

Kiedy jestem zwolnieniu ostatniego odniesienia zewnętrzne, które mam do klasy gier, didTurnIntoFault nie jest wywoływana. Teraz, moje pytanie brzmi, czy może to wynikać z cyklicznego odniesienia stworzonego powyżej (Jak widać, obie właściwości są "zachowane"), czy też podstawowe dane zarządzają tym wszystkim, a problem jest gdzieś w moim kodzie.

Odpowiedz

4

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

W przypadku relacji między zarządzanymi obiektami każdy obiekt zachowuje silne odniesienie do obiektu lub obiektów, z którymi jest powiązany. W zarządzanym środowisku pamięci powoduje to cykle zatrzymania (patrz Object Ownership and Disposal), które mogą zapobiec dealowaniu niechcianych obiektów. Aby zapewnić, że zatrzymane cykle zostaną zerwane, po zakończeniu pracy z obiektem można użyć metody kontekstu zarządzanego obiektu, aby zmienić ją w błąd.

Zazwyczaj używa się refreshObject:mergeChanges:, aby odświeżyć wartości właściwości zarządzanego obiektu. Jeśli flaga mergeChanges to YES, metoda łączy wartości właściwości obiektu z wartościami obiektu dostępnego w trwałym koordynatorze magazynu. Jeśli flaga ma wartość NO, metoda po prostu przekształca obiekt z powrotem w błąd bez scalania, co powoduje, że zwalnia on powiązane obiekty zarządzane. Spowoduje to przerwanie cyklu zatrzymania między tym obiektem zarządzanym a pozostałymi obiektami zarządzanymi, które zachował.

+0

Mogę przysiąc, że mam RTFM, ale mnie tęskniło :) Dzięki! – Manav

+2

Może dodać, że musisz to zrobić rekursywnie, tj. Zerwanie cykli dla zarządzanego obiektu NIE powoduje automatycznego przerwania żadnych cykli, które obiekty potomne mogą mieć między sobą – Manav

Powiązane problemy