2012-01-18 9 views
8

Kompilator wydaje się nie mieć problemu z dwóch następujących deklaracji:__strong i __weak umieszczenie słów kluczowych - Objective-C

NSObject * __weak weakThing; 
__weak NSObject *anotherWeakThing; 

Czy jest jakaś różnica między tymi dwoma? Czy zachowanie przypomina model const keyword?

Pytam bo ostrzeżenie Xcode generalnie sugestie ...

SomeDataType * __weak/__strong

... kiedy już goofed coś. Więc starałem się podążać za tym schematem, ale zastanawiałem się, czy w ogóle istnieje jakaś różnica.

Odpowiedz

13

Nie, nie ma różnicy. Ze słowem kluczowym const jest wiele rzeczy, do których może się odnosić deklaracja; może dotyczyć wskaźnika lub może odnosić się do wskazywanej wartości.

Kwalifikatory własności mają sens tylko na wskaźnikach do obiektów. Sam przedmiot nie może być "silny" lub "słaby"; to wskaźnik do obiektu, który jest silny lub słaby. ARC ma sens tylko wtedy, gdy jest zastosowany bezpośrednio do typów wskaźnik-obiekt i wpływa na to, jak czas życia wskaźnika wpłynie na czas życia obiektu.

Biorąc pod uwagę, że nigdy nie ma żadnych wątpliwości co do tego, do czego kwalifikator własności może mieć zastosowanie, specyfikacja ARC umożliwia umieszczenie kwalifikatora własności w dowolnym miejscu definicji wskaźnika na obiekcie. Oba przykłady są równie ważne. Podobnie, wszystkie z poniższych oznaczają to samo:

NSError * __autoreleasing * someObject; 
NSError __autoreleasing ** someObject; 
__autoreleasing NSError ** someObject; 

pamiętać, że kompilator narzeka na ten jeden, choć:

NSError ** __autoreleasing someObject; 

To dlatego, że zostały przeniesione poza definicją pointer- sprzeciwiać się. Możesz sparsować to jako (NSError *)* __autoreleasing someObject;. Zanim przejdziesz do drugiego *, już zdefiniowałeś typ wskaźnika, więc __autoreleasing nie ma sensu. Wszędzie w definicji typu wskaźnika jest w porządku, ale po przejściu na typ wskaźnika do wskaźnika, odnosi się to do czegoś innego i nie ma już sensu.

6

Nie jest różnica jeśli masz

__weak NSObject *someWeakThing, *someSupposedlyButNotReallyWeakThing; 

ponieważ __weak tylko łudząco zastosowanie do pierwszej zmiennej. (jest to podobny błąd dla nowicjusza, który nie będzie działał tak jak "oczekiwano").

Powiązane problemy