2011-03-02 22 views
36

entiendo que @synthesize window; combinarse con @property 'auto-crea' sus setters y getters, pero no estoy seguro exactamente lo que sucede cuando se asigna un valor como¿Qué hace @synthesize window = _window do?

@synthesize searchBar = _searchBar; 

¿Quiere decir esto que simplemente puedo usar _searchBar en cambio, en mis métodos en lugar de decir self.searchBar?

¿Es para evitar un choque de nombres Ivar, por ejemplo, con este método delegado:

- (void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 

Es el equivalente de self.searchBar en lugar de searchBar o son los dos idénticos de todos modos?

Respuesta

32

Sus propiedades casi siempre tienen una variable de respaldo. Lo

@synthesize searchBar = _searchBar; 

hace es declarar que la variable de respaldo para su barra de búsqueda se llama _searchBar. Esto le permite desacoplar el nombre de la propiedad del nombre de su variable. De hecho, si no usa @synthesize, no necesita tener una variable de respaldo en absoluto.

En cuanto a por qué personas hacen esto, cada uno tiene razones diferentes. En lo personal, lo hago para

  1. enfrentamientos Evitar en caso de nombres de variables y
  2. dejar claro cuando estoy usando una variable local y cuando estoy usando una variable de instancia.
+0

"... casi siempre ..." ¿esto está determinado por el compilador o el programador? ¿Puede proporcionar ejemplos de cuándo no existe la variable de respaldo? – mobibob

+2

Determinado por el programador. El ejemplo de cuando no existe una variable de respaldo es 'self.tableview' en un' UITableViewController'. Al obtener esa propiedad, se devuelve la misma vista que devuelve 'self.view'. – kubi

17
@synthesize searchBar = _searchBar; 

dice para hacer un método getter llamado "barra de búsqueda" (etc.) para la instancia _searchBar variable.

El guión bajo en la variable _searchBar generalmente significa "No accedas a mí directamente a menos que realmente sepas lo que estás haciendo. Utiliza los métodos getter y setter".

+0

'El guión bajo en la variable _searchBar generalmente significa ...' - ¿es esto solo por convención? – Gazzer

+3

Parece ser una convención moderadamente común en Objective C. – hotpaw2

+0

Y esta es la convención ahora utilizada por el compilador de Apple para la síntesis automática de propiedades. – hotpaw2

18

La sintaxis se describe en la documentación - consulte Property Implementation Directives.

La razón para cambiar el nombre de la variable de instancia es precisamente para desalentar el acceso directo. Un subrayado es utilizado por la convención. (Nota: Aunque el Coding Guidelines advierten actualmente contra el uso de un guión bajo, este consejo es fuera de fecha.)

vez más por la documentación (ver Using Accessor Methods), además de los métodos de arranque y dealloc, siempre se debe utilizar métodos de acceso. Utiliza los accesos establecidos para garantizar que usted administre la memoria correctamente y que emita las notificaciones de cambio de KVO, si corresponde. Utiliza los accessors para garantizar que la propiedad esté correctamente inicializada. Hay varios lugares comunes donde las propiedades se inicializan perezosamente; si no usas el acceso, obtienes nada ...

Un ejemplo de acceso directo: El uso de una de las plantillas de Datos Básicos, si se ha utilizado:

NSFetchRequest *request = ...; 
NSError *error = nil; 

NSArray *results = [__managedObjectContext executeFetchRequest:request error:&error]; 

en lugar de

NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error]; 

continuación, - porque el contexto objeto gestionado se crea perezosamente el método de acceso: puede terminar enviando un mensaje a cero y sin obtener ningún resultado.

+1

Gracias por una respuesta detallada. ¿Puede explicar esto: "precisamente para desalentar el acceso directo". Tal vez con un ejemplo de código de acceso directo, acceso indirecto. – Gazzer

+0

¡Gran respuesta detallada! – Poliquin

Cuestiones relacionadas