2014-12-03 8 views
6

Znalazłem to w pliku nagłówkowym UITableView i prawie każda właściwość ma styl inny niż łuk, chociaż mój projekt używa ARC.Dlaczego atrybut atrybutu właściwości delegata UITableView nie jest słaby?

@property (nonatomic, assign) id <UITableViewDataSource> dataSource; 
@property (nonatomic, assign) id <UITableViewDelegate> delegate; 

Dlaczego Apple nie należy używać weak własność zamiast assign, jest to wsteczna kompatybilność dla non-łuku? Jeśli tak, to dlaczego nie używać __has_feature(objc_arc), aby odróżnić ARC od ARC.

#if __has_feature(objc_arc) 
@property (nonatomic, weak) id <UITableViewDataSource> dataSource; 
@property (nonatomic, weak) id <UITableViewDelegate> delegate; 
#else 
@property (nonatomic, assign) id <UITableViewDataSource> dataSource; 
@property (nonatomic, assign) id <UITableViewDelegate> delegate; 
#endif 

Mam nadzieję delegate jest słaby, więc nie trzeba ustawić delegata do zera, gdy instancja delegata jest zwalniane.

Dzięki za pomoc.

Edit:

Pragnę zauważyć, że __has_feature(objc_arc) jest błędne, ponieważ mogę używać ARC kiedy mój cel wdrażania jest 4.3, ale wtedy nie mogę korzystać weak. Tak więc warunek powinien być taki, czy mój cel wdrożenia jest równy 5,0 lub wyższy.

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_5_0 
@property (nonatomic, weak) id <UITableViewDataSource> dataSource; 
@property (nonatomic, weak) id <UITableViewDelegate> delegate; 
#else 
@property (nonatomic, assign) id <UITableViewDataSource> dataSource; 
@property (nonatomic, assign) id <UITableViewDelegate> delegate; 
#endif 
+0

Zobacz moje wyjaśnienie tutaj: http://stackoverflow.com/a/24469143/341994 Nie jest "kompatybilny wstecz z non-ARC"; to nie jest ARC. – matt

+0

@matt Dziękuję bardzo. Czy uważasz, że lepiej jest, jeśli Apple używa '#if __IPHONE_OS_VERSION_MIN_REQUIRED> = __IPHONE_5_0', aby zapewnić lepszą obsługę Cocoa z ARC? Lub bardzo trudno to osiągnąć. – KudoCC

+1

Te części kakao są stare. W najbliższym czasie się nie zmienią. Poprzedzają ARC od wielu lat. Są jakie są. Pójść dalej. – matt

Odpowiedz

4

Dlaczego Apple nie używa weak property zamiast przypisać, czy jest to kompatybilność wsteczna dla nie-łuków?

Zrobiłem trochę research and found, że __weak jest synonimem modyfikatora "assign". Ale różnica polega na tym, że instancja delegata nie zostanie ustawiona jako zero, gdy zostanie zwerbowana. Zwykle używasz modyfikatora przypisania dla IBOutletów i delegatów. W ARC jest to zastąpione przez __weak. Jednak istnieje zastrzeżenie. __weak wymaga wdrożenia aplikacji w środowisku wykonawczym, które obsługuje zerowanie słabych referencji. Obejmuje to,> = (iOS 5 i Lion). Snow Leopard lub iOS 4 i starsze systemy operacyjne nie obsługują zerowania słabych referencji. Oznacza to oczywiście, że nie można używać __weakich modyfikatorów własności, jeśli planujesz wdrożyć do starszych systemów operacyjnych. Więc tak, w tym wrażliwym jest kompatybilność wsteczna dla nie-łuku.

+0

Mówisz, że __weak jest synonimem przypisywania modyfikatora, ale kiedy używam assign, po delegalizacji instancji delegata, delegat nie zostanie ustawiony na zero, jak robi modyfikator __weak. – KudoCC

+0

Tak, proszę pana, to prawda. Czy zaktualizowałeś się, czy podążyłeś za linkiem i opisem? Rozwiążesz ten powód. –

+0

Dzięki, zobaczę link później :) – KudoCC

0

Zauważ, że gdy masz delegata że przypiszmy, to sprawia, że ​​bardzo ważne jest, aby zawsze ustawić tę wartość delegata do zera, gdy obiekt ma być zwalniane - tak obiekt powinny zawsze być ostrożnym do zera poza delegata odniesienia w dealloc, jeśli nie zostało to zrobione gdzie indziej.

W ten sposób przypisanie delegata, wszelkie pozostawione referencje, będą nieważne po zwolnieniu obiektu (wskazując na pamięć, która nie jest już przydzielona do oczekiwanego rodzaju obiektu) - i w ten sposób spowodować awarię, jeśli spróbujesz go użyć. Znakiem tego w debugerze jest sytuacja, w której debugger twierdzi, że pewna zmienna ma typ, który wydaje się całkowicie błędny, od tego, co jest faktycznie deklarowane jako zmienna.

To może być bardzo powodem „Dlaczego nie jest atrybutem UITableView rekreacyjnego delegata słabego „

Nadzieja to może pomóc.

Powiązane problemy