2009-08-11 8 views
9

¿Hay alguna manera de asignar un parámetro al método con el mismo nombre que una variable de instancia en Objective-C sin ocultar esa variable?Parámetros ocultar variables de instancia en Objective-C

Por ejemplo,

- (void)doSomething:(id)object 
{ 
    self.object = object; 
}

El código anterior muestra el aviso "declaración local de 'objeto' se esconde variable de instancia."

La solución obvia es nombrar los argumentos del parámetro de manera diferente, pero me resulta molesto tener que elegir un nombre como "un Objeto" en lugar de "objeto".

+1

Cuando dice "variable local", creo que quiere decir "variable de instancia". Los parámetros son un tipo de variable local. – outis

+0

Gracias. Corregí la pregunta. – titaniumdecoy

Respuesta

8

Puede usar notación de puntos para acceder a las propiedades (como lo hace en el ejemplo), pero las variables de instancia tienen una sola ruta de acceso, por lo que la única solución si desea acceder a una variable de instancia y una variable local ellos diferentes nombres.

Formalmente hablando, esto está relacionado con las restricciones en alpha conversion en cálculo lambda, específicamente que una variable enlazada debe permanecer unida y una variable libre permanecer libre.

Si no le gusta el prefijo "an" para los locales, puede usar la convención de prefijo "_" para variables de instancia, ya que también son variables efectivamente protegidas.

@interface AClass { 
    id _object; 
} 
@property (retain) id object; 
@end 

@implementation AClass 
@synthesize object = _object; 

- (void)doSomething:(id)object 
{ 
    [_object befriend:object]; 
} 
... 

Por supuesto, "_" se lee como "mi", por lo que puede ser tan desagradable como "A"/"una" antes de parámetros. Renombrar es la mejor solución ya que las variables locales y de instancia tienen roles diferentes, y sus nombres deberían reflejar esto.

+2

En realidad, puede acceder a ivars con self-> object. Además, Apple "reserva" el prefijo de subrayado para su propio uso, aunque nadie parece prestarle atención. Personalmente, uso i_ como el prefijo de mis ivars, que también ayuda a distinguirlos de las propiedades. –

+0

Agregar los guiones bajos también te permite diferenciar entre '_object = something' y' self.object = something' que son dos bits de código completamente diferentes. – kubi

+0

¿Qué sucede si el método en cuestión es realmente el colocador de la variable de instancia? ¿Algo diferente? – Tony

13

Es posible que pueda hacer algo como self->object = object, pero la convención Objective-C (derivada de Smalltalk) es prefijar parámetros con "a" o "an" si el parámetro tiene el mismo nombre que una variable de instancia.

+2

+1 para esta respuesta. Las API de Cocoa públicas usan nombres de parámetros como "anObject" y "aDictionary" para diferenciar las variables de instancia. Además de seguir la convención, esto hace que sea menos probable que se refiera a la variable equivocada por accidente, y algo más fácil de refactorizar. –

+0

Esta es la solución recomendada por Apple, además es una linda convención, IMO. "- (void) doSomething: (id) unObjeto". – andyvn22

Cuestiones relacionadas