2012-01-18 16 views
8

El compilador parece tener ningún problema con los dos siguientes declaraciones:__strong y colocación de palabras clave __weak - Objective-C

NSObject * __weak weakThing; 
__weak NSObject *anotherWeakThing; 

¿Hay alguna diferencia entre los dos? ¿Es el comportamiento como el const keyword?

Lo pregunto porque la advertencia de Xcode general sugieren ...

SomeDataType * __weak/__strong

... cuando has goofed algo. Así que traté de seguir este patrón, pero me pregunté si habría alguna diferencia.

Respuesta

13

No, no hay diferencia. Con la palabra clave const, hay varias cosas que podría aplicar en una declaración; podría aplicarse al puntero, o podría aplicarse al valor al que se apunta.

Los calificadores de propiedad solo tienen sentido en los punteros a los objetos. El objeto en sí no puede ser "fuerte" o "débil"; es el puntero del objeto que es fuerte o débil. El ARC solo tiene sentido cuando se aplica directamente a los tipos de puntero a objeto, y afecta cómo la vida útil del puntero afectará la duración del objeto.

Dado que nunca hay ninguna ambigüedad sobre a qué se podría aplicar el calificador de propiedad, la especificación ARC permite la colocación del calificador de propiedad en cualquier lugar de la definición del apuntador a objeto. Ambos ejemplos son igualmente válidos. Del mismo modo, todos los siguientes significan lo mismo:

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

Tenga en cuenta que el compilador se queja de éste, sin embargo:

NSError ** __autoreleasing someObject; 

Esto se debe a que se ha movido más allá de la definición de la Puntero- al objeto. Podría analizar ese como (NSError *)* __autoreleasing someObject;. Cuando llega al segundo *, ya ha definido el tipo del puntero, por lo que __autoreleasing no tiene ningún sentido. En cualquier lugar dentro de la definición del tipo de puntero está bien, pero una vez que se pasa al tipo puntero-a-puntero, entonces se está refiriendo a otra cosa, y ya no tiene sentido.

6

Hay es una diferencia si usted tiene

__weak NSObject *someWeakThing, *someSupposedlyButNotReallyWeakThing; 

porque el __weak será solamente confusamente aplicará a la primera variable. (Este es un error similar al novato

NSObject* one, two; 

que por supuesto no funcionará como "esperado", tampoco).

Cuestiones relacionadas