Próbuję nauczyć się automatycznego liczenia referencji w iOS 5. Teraz pierwsza część tego pytania powinna być łatwa:
Czy to prawda, że NIE muszę pisać jawnych instrukcji release-property w moim dealloc, gdy używam ARC? Innymi słowy, czy to prawda, że poniższe elementy NIE wymagają wyraźnego cofnięcia przydziału?
@interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end
Moje następne i ważniejsze pytanie pochodzi z wiersza w dokumencie Przejście na wersję ARC :
Nie musisz (a nawet nie możesz) zwolnić zmiennych instancji, ale może być konieczne wywołanie funkcji [self setDelegate: nil] na klasach systemowych i innym kodzie, który nie jest kompilowany przy użyciu ARC.
To nasuwa pytanie: skąd mam wiedzieć, które klasy systemowe nie są kompilowane z ARC? Kiedy powinienem tworzyć własne dealloc i jawnie ustawiać silnie zachowujące właściwości na zero? Czy powinienem założyć, że wszystkie klasy ram NS i UI używane we właściwościach wymagają jawnych deallocs?
Istnieje wiele informacji na temat SO i nie tylko na temat praktyk zwalniania zabezpieczającego ivar nieruchomości podczas korzystania z ręcznego śledzenia odniesień, ale stosunkowo niewiele na ten temat w przypadku korzystania z ARC.
źródło
MyController : UIViewController
klasę, która tworzy i jest właścicielem UIView, a także ustawia delegata widoku na siebie. To jedyny zachowany właściciel tego poglądu. Kiedy kontroler zostanie zwolniony, widok powinien również zostać zwolniony. Czy w takim razie ma znaczenie, czy wskaźnik delegata zwisa?UIWebView
, dokumenty wyraźnie stwierdzają, że musisz wyzerować delegata.unsafe_unretained
jest dokładnie odpowiednikiemassign
właściwości i jest normalnym zachowaniem dla relacji delegatów w ramach MRR i należy je uzupełnić.Żeby udzielić przeciwnej odpowiedzi ...
Krótka odpowiedź : nie, nie musisz eliminować właściwości
dealloc
autosyntetyzowanych w ramach ARC. I nie musisz używać setera dla tych winit
.Długa odpowiedź : Powinieneś wyeliminować zsyntetyzowane na zamówienie właściwości
dealloc
, nawet pod ARC. I powinieneś użyć setera dla tych winit
.Chodzi o to, że twoje zsyntetyzowane na zamówienie właściwości powinny być bezpieczne i symetryczne pod względem zerowania.
Możliwy ustawiacz timera:
Możliwy ustawiacz dla scrollview, tableview, webview, textfield, ...:
Możliwy ustawiacz dla właściwości KVO:
Wtedy nie trzeba powielić dowolny kod
dealloc
,didReceiveMemoryWarning
,viewDidUnload
, ... a nieruchomość może być bezpiecznie podawane do wiadomości publicznej. Jeśli martwiłeś się, że nie ma żadnych właściwości wdealloc
, być może nadszedł czas, aby ponownie sprawdzić swoje setery.źródło