2015-04-16 13 views
5

Jestem trochę zdezorientowany, jeśli chodzi o używanie Strong lub Weak w moim konkretnym przypadku.Silne i słabe zamieszanie w iOS

mam jedną klasę ParentClass który ma 3 objectContainerClass1, ContainerClass2 i ContainerClass3.

Każdy ContainerClass ma swoje silne właściwości z obiektów takich jak zmienny NSMutableArray

Teraz w moim przypadku, muszę pokazać tylko jeden ContainerClass na raz, więc jeśli ContainerClass1 jest pokazany następnie ContainerClass2 i ContainerClass3 nie jest wymagane.

Więc pomyślałem, że kiedy pokażę ContainerClass1, ustawię obiekty ContainerClass2 i ContainerClass3 na nil. Tutaj jestem zdezorientowany, czy tylko ustawienie innej pamięci ContainerClass (nie pokazano) na ma być przechowywane w pamięci? ponieważ mają silne właściwości do innych obiektów.

Czy powinienem najpierw ustawić wszystkie inne silne właściwości ContainerClass's na nil, a następnie ustawić ContainerClass na nil?

Z góry dziękuję.

+0

Przede wszystkim należy ustawić słabe dla IBOutlets. I tak, gdy ustawisz ContainerClass2 na zero, wszystkie IBOutlety staną się zerowe, ponieważ jego rodzic jest zerowy. –

+0

Zgadzam się z Yogeshem dla IBOutletów :) –

+0

http://www.rypress.com/tutorials/objective-c/properties – Yuyutsu

Odpowiedz

8

@zoeb, może ten link pomoże Ci uniknąć podstawowych problemów z pamięcią.

how-to-overcome-memory-problems-in-iphone-applications-with-automatic-reference-counting

Zmieniano:

Ponieważ wiemy, że Apple wprowadziła ARC w IOS 5.0, ARC jest cechą poziom kompilator, który upraszcza proces eksploatacji obiektów Objective-C. Przed wprowadzeniem ARC pamięć zarządzana ręcznie oznacza "ręczne liczenie referencji (MRC)". W przypadku MRC programista musi pamiętać, kiedy zwolnić lub zatrzymać obiekt. Oznacza to, że programista musi zarządzać cyklem życia obiektów-c.

Z perspektywy programisty, najbardziej interesuje nas dodanie nowych funkcji do naszej aplikacji, a następnie skupienie się na problemach z pamięcią. Ale rzeczy są pewne, że zarządzanie pamięcią odgrywa kluczową rolę w sukcesie aplikacji. Aby zapewnić pomoc programistom, firma Apple opracowała sposób automatycznego zarządzania pamięcią.

ARC inteligentnie zarządza pamięcią, ale nie jest to 100 procent. Podczas rozwoju musimy skupić się na kilku punktach, aby usunąć naszą aplikację z problemu braku pamięci. Tutaj spróbuję dostarczyć rozwiązanie do zarządzania pamięcią w aplikacji bazowej ARC. to też nie jest 100 procent. ale spróbuje pomóc kompilatorowi w oszacowaniu cyklu życia obiektywnego obiektu.

Oto kilka kroków, które należy wdrożyć w swoich kontrolerach.

Krok 1. Zadeklaruj słabą właściwość dla wszystkich elementów sterowania interfejsu użytkownika używanych w aplikacji.

przykład:
@property (nonatomic, weak) IBOutlet UIButton* btnPost;

@property (nonatomic, weak) IBOutlet UITableView* tblMessages; 

etc.

Krok 2. Jak na nasze dewelopera najbardziej kłopotliwe pytanie brzmi, czy kompilator pozwalają zadeklarować „dealloc” metody w aplikacji bazowej ARC. odpowiedź brzmi "tak", ale nie wolno jej deklarować "[super dealoc]" w środku. więc nadpisuj metodę "dealloc" w każdym kontrolerze.

-(void)dealloc{ 

} 

Krok 3. Usuń obciążony obiekt z SuperView w „dealloc” metody, a następnie ustawienie tylko „nil” odniesieniem jak MKMapview, Scrollview itp

-(void)dealloc{ 
dictAddress = nil; 
arrayList = nil; 
[map removeFromSuperview]; 
[scrollView removeFromSuperview]; 
} 

Krok 4. Unikać mechanizm martwego zamka. (Przykład: tam jest klasa A i klasa B. Klasy B deklaruje się Delegat z typem właściwości "Silny" tak, że klasa A i klasa B zależne od siebie nawzajem ulegną zwolnieniu, więc w tym przypadku metoda "dealloc" jest niezwiązane z żadną z klas, tak że klasa zachowuje pamięć, aby usunąć takie przypadki, musimy zachować "Przypisz" odwołanie do obiektu Delegata.) jest to tylko na przykład. Musimy wziąć pod uwagę inne rzeczy, takie jak "Zachowaj słabe odniesienie do bloku, aby zwolnił obiekty po zakończeniu jego realizacji".

to podstawowe czynności, które pozwalają uniknąć problemów z pamięcią. Jeśli napotkasz problemy z pamięcią, musisz skorzystać z pomocy analizatora, aby znaleźć wyciek i zużycie pamięci.

Poniższy link pomoże Ci w analizie pamięci.

Mamory analyzer

+0

Ohh Myślałem, że dealloc nie zadzwoni automatycznie w ARC –

+0

'dealloc' jest również wywoływany w ARC. więc ustaw referencję 'nil' na silną zmienną. –

+0

@None - ARC ** automatycznie ** obsługuje silne (i słabe) referencje, o to chodzi. Jest ** nie ** potrzeba użycia 'dealloc' do ustawienia silnych zmiennych na' nil'. Zatem krok 3 jest bezcelowy. – CRD

Powiązane problemy