2012-01-18 4 views
8

Il compilatore sembra non avere alcun problema con i due seguenti dichiarazioni:__strong e inserimento di parole chiave __weak - Objective-C

NSObject * __weak weakThing; 
__weak NSObject *anotherWeakThing; 

C'è una differenza tra i due? Il comportamento è simile allo const keyword?

Lo chiedo perché gli avvisi di Xcode generalmente suggeriscono ...

SomeDataType * __weak/__strong

... quando hai imbrogliato qualcosa. Quindi ho cercato di seguire questo schema, ma mi chiedevo se c'era una differenza.

risposta

13

No, non c'è differenza. Con la parola chiave const, ci sono più cose a cui si può applicare in una dichiarazione; potrebbe essere applicato al puntatore o potrebbe essere applicato al valore puntato.

I qualificatori di proprietà hanno senso solo per i puntatori agli oggetti. L'oggetto stesso non può essere "forte" o "debole"; è il puntatore all'oggetto che è forte o debole. ARC ha senso solo se applicato direttamente ai tipi di puntatore a oggetto e influenza il modo in cui la durata del puntatore influisce sulla durata dell'oggetto.

Dato che non vi è mai alcuna ambiguità su ciò a cui il qualificatore di proprietà potrebbe applicare, la specifica ARC consente il posizionamento del qualificatore di proprietà in qualsiasi punto della definizione del puntatore all'oggetto. Entrambi i tuoi esempi sono ugualmente validi. Allo stesso modo, tutti i seguenti significano la stessa cosa:

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

Si noti che il compilatore si lamenta di questo, però:

NSError ** __autoreleasing someObject; 

Questo perché hai spostato al di là della definizione del pointer- obiettare. Potresti analizzarlo come (NSError *)* __autoreleasing someObject;. Quando arrivi al secondo *, hai già definito il tipo di puntatore, quindi __autoreleasing non ha alcun senso. Ovunque all'interno della definizione del tipo di puntatore va bene, ma una volta che si passa al tipo puntatore-puntatore, allora ci si riferisce a qualcos'altro, e non ha più senso.

6

Ci è una differenza se si dispone di

__weak NSObject *someWeakThing, *someSupposedlyButNotReallyWeakThing; 

perché la __weak sarà solo confusamente applica alla prima variabile. (questo è un errore simile al rookie

NSObject* one, two; 

che ovviamente non funzionerà come "previsto", neanche).