2012-02-10 21 views
6

Duplicar posible:
Prefixing property names with an underscore in Objective CViewController = _ViewController significa

acabo de empezar iPhone de desarrollo de aplicaciones y se dio cuenta de que cuando se genera un nuevo proyecto, el siguiente código se puede ver en AppDelegate. m

@synthesize window = _window; 
@synthesize viewController = _viewController; 

AND en el archivo AppDelegate.h dice

@property (strong, nonatomic) UIWindow window; 
@property (strong, nonatomic) ViewController controller; 

Me gustaría saber exactamente qué significa esto, especialmente la parte de sintetización. ¿Es instanciando una variable privada local? Si es así, ¿cómo es esto diferente de decir @synthesize viewController;

Gracias

+1

http://stackoverflow.com/q/7174277/ http://stackoverflow.com/q/822487/ http://stackoverflow.com/q/2371489/ http://stackoverflow.com/q/6139593/ http: // stackoverflow .com/search? q =% 5Bobjc% 5D + guión bajo + propiedad & enviar = buscar –

Respuesta

6

El patrón @synthesize foo = bar; le permite definir una propiedad de clave foo que consigue sintetizar en combinación con una variable de instancia del nombre bar (o _foo si quieres), mientras que @synthesize foo; simplemente sintetiza una variable de la propiedad y la instancia con el mismo nombre (foo).

@property (...) Foo *foo; 
@synthesize foo = _foo; 

es una especie de equivalente a esto:

@interface MyClass : NSObject { 
    //result of @synthesize...: 
    Foo *_foo; 
} 

//result of @property...: 
- (void)setFoo:(Foo *)foo; 
//result of @property...: 
- (Foo *)foo; 

@end 

@implementation MyClass 

//result of @synthesize...: 
- (void)setFoo:(Foo *)foo { 
    _foo = foo; //simplified! 
} 

//result of @synthesize...: 
- (Foo *)foo { 
    return _foo; //simplified! 
} 

@end 

la variable de instancia sintetizada sería la usarse ya sea a través _foo o self->_foo (de los cuales el primero es en realidad una forma implícita), lo que implicaría no método de acceso de llamada que sea.

Mientras que la propiedad sintetizada se usaría a través del self.foo, que luego utilizaría una llamada a uno de los métodos de acceso sintetizado.

Solo piense en @synthesize foo; como implícita (tenga en cuenta la falta de un _ aquí, nombres iguales).

5

Más o menos. Estas líneas en las .h declarar la existencia de dos variables públicas ventana y controlador de llamadas:

@property (strong, nonatomic) UIWindow window; 
@property (strong, nonatomic) ViewController controller; 

embargo, estas líneas sólo se cuentan la existencia de las variables, que en realidad no crean. Depende de la clase implementar esto como lo desee: pueden ser variables virtuales, por ejemplo, que en realidad no existen, pero llaman a métodos que crean datos de forma programática o los cargan desde una base de datos o algo así.

Estas líneas en el archivo .m realmente crean ("sintetizan") las variables.

@synthesize window = _window; 
@synthesize viewController = _viewController; 

Lo que dicen estas líneas es que el nombre de la variable interna es _window, pero el nombre público de la variable es window.Eso significa que dentro de la clase se puede acceder a la variable directamente diciendo

_window = something; 

Pero externamente hay que acceder a él mediante

appDelegate.window = something; 

Porque eso es su nombre pública. También puede acceder internamente a la clase usando self.window.

Otro hecho interesante de Objective-C es que el uso de la sintaxis de punto para acceder a las variables de esta manera es realmente una forma práctica de llamar a los métodos setter y getter para acceder a ellos. Así que la sintetizan, además de crear una variable llamada _window, está también la definición de los dos métodos siguientes:

- (void)setWindow:(UIWindow *)window; // to set the _window variable 
- (UIWindow *)window; // to get the _window variable 

Y usted puede llamar a estos métodos directamente si se quiere, usando

[self setWindow:someValue]; 
UIWindow *window = [self window]; 
Cuestiones relacionadas