2013-07-01 6 views
8

Masz interesujący problem, gdy istnieje klasa, do której odwołuje się w układzie XIB (podklasa UIScrollView) i nie jest ona de-alokowana zgodnie z Instruments/Allocations i nie narusza rutyny dealloc. Nazwijmy go Sclass1.IOS 6.1 z klasą ARC z XIB nie jest zwolniony, UIClassSwapper

Istnieje klasa używająca (nazwijmy to Uclass), która ma plik XIB i gniazdko.

@property (nonatomic, weak) IBOutlet Sclass1* sclass1; 

To jest poprawnie podpięty do układu pliku XIB.

Sclass1 to właściwość przydzielana po załadowaniu XIB dla Uclass. Uclass jest zwalniany, a następnie odtwarzany od czasu do czasu, a co za tym idzie, mamy kolejną instancję Sclass1, ale Sclass1 nigdy nie zniknie i nie może znaleźć innego odniesienia do niego.

Wywiercić w instrumencie pokazuje jeden Malloc i to jest to.

FYI, klasa rozkręci z

[UIClassSwapper initWithCoder:] 

Odpowiedz

0

Myślę, że @property powinna być silna dla klasy:

@property (nonatomic, strong) IBOutlet Sclass1* sclass1; 

Ponieważ strong jest równoważna retain i ARC uda dopuszczenie do ty.

Będziesz mieć więcej informacji z Dokumentacją Apple na temat Transitioning to ARC Release Notes w sekcji atrybutów właściwości.

+0

To jest poprawna odpowiedź, wszystko, co jest IBOutletem, musi być słabe, widok nie zostaje zwolniony, ponieważ kontroler ma punkt zatrzymania do wylotu, a wylot ma odniesienie do kontrolera. Tworzenie cyklu zatrzymania. Mieć uprowadzenie. –

5

Jeśli obiekt nie zostanie zwolniony w ramach ARC, oznacza to, że istnieje silne odniesienie do niego. Ponieważ twoja własność to weak, obiekt musi być silnie własnością czegoś innego niż obiekt Uclass (w przeciwnym razie zostałby zwolniony natychmiast po załadowaniu XIB). W kodzie masz pod warunkiem, że nie jest jasne, co rzeczywiste silny właściciel tego obiektu jest, ale zakładam, że może to być jeden (lub więcej) z następujących czynności:

  1. Od klasie obiektu jest UIView podklasa, może być (silnie) odwołane przez jej superview, jeśli dodano jako jeden z subviews. Dzieje się to automatycznie po załadowaniu pliku XIB. Jeśli superview nie zostanie zwolniony, nie będzie obiektu SClass. Możesz usunąć tę własność, wywołując removeFromSuperview
  2. Silny cykl własności (cykl zatrzymania) istnieje gdzieś wśród obiektów ivar obiektu SClass1 (tj. Jedna z silnie powiązanych zmiennych instancji ma silne odniesienie do jej właściciela - SClass1) . Pamiętaj, że każdy blok korzystający z self bezpośrednio zachowuje silne referencje. Posiadanie silnego odniesienia do bloku często prowadzi do cyklu zatrzymania. Zapisz self na __weak var i przekaż go do bloku, chyba że masz ku temu dobry powód.
  3. Ręcznie utworzone silne odniesienie istnieje np. dodanie obiektu do kontenera lub zapisanie wskaźnika do zmiennej innej niż __weak.

Spróbuj znaleźć i usunąć te silne własności. Dopiero po usunięciu wszystkich obiektów obiekt może zostać zwolniony.

1

Ponieważ twoja własność jest słaba i nadal nie jest zwolniona, szukaj silnych odniesień do Sclassa lub jego właściciela, Uclass. Być może używasz Uclass (lub Sclass) w bloku bezpośrednio, bez __weak typeof (self) weakSelf dancing i ten blok tworzy cykl zachowania. Obserwuj również relacje rodzic-dziecko i delegatów. Być może jest delegat, który jest silny zamiast słabego lub dwóch kontrolerów posiada silne odniesienia do siebie nawzajem.

Ponadto, jeśli chcesz uzyskać bardziej szczegółowe odpowiedzi, opublikuj bardziej odpowiedni kod.

+0

Dzięki za wskazanie wywołanego blokiem cyklu zatrzymania. To rzeczywiście powszechny przypadek IMO. Dodałem to również do mojej odpowiedzi. – burax

0

Niedawno miałem takie same objawy - rozwiązać go w moim przypadku, mój obiekt działał jako delegat z wielu innych przedmiotów, więc musiała zwolnić obiekt ze wszystkich swoich obowiązków delegata zanim byłoby nazwać dealloc

Powiązane problemy