He visto el siguiente código:
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
¿Cuál es la relación entre mapViewy mapView1? ¿Crea un método sety getpara mapView1?
iphone
objective-c
Hoang Duy Nam
fuente
fuente

Respuestas:
En su ejemplo,
mapView1es una variable de instancia (ivar), un almacenamiento de memoria que pertenece a una instancia de la clase definida enexample.hyexample.m.mapViewes el nombre de una propiedad . Las propiedades son atributos de un objeto que se pueden leer o establecer mediante la notación de puntos:myObject.mapView. Una propiedad no tiene que basarse en un ivar, pero la mayoría de las propiedades sí. La@propertydeclaración simplemente le dice al mundo que hay una propiedad llamadamapView.@synthesize mapView = mapView1;Esta línea le dice al compilador que cree un setter y getter
mapView, y que deben usar el ivar llamadomapView1. Sin la= mapView1parte, el compilador supondría que la propiedad y ivar tienen el mismo nombre. (En este caso, eso produciría un error de compilación, ya que no se llama ivarmapView).El resultado de esta
@synthesizedeclaración es similar a si hubiera agregado este código usted mismo:Si agrega ese código a la clase usted mismo, puede reemplazar la
@synthesizedeclaración con@dynamic mapView;Lo principal es tener una distinción conceptual muy clara entre ivars y propiedades. Son realmente dos conceptos muy diferentes.
fuente
@synthesizecrea un getter y un setter para la variable.Esto le permite especificar algunos atributos para sus variables y cuando
@synthesizeesa propiedad de la variable genera el captador y definidor para la variable.El nombre de la propiedad puede ser el mismo que el nombre de la variable. A veces la gente quiere que sea diferente con el fin de utilizarlo en
initodealloco cuando el parámetro se pasa con el nombre de la misma variable.fuente
De la documentación :
fuente
Como acabo de encontrarme con este problema al editar código heredado, quiero hacer notas adicionales a las respuestas existentes que uno debe tener en cuenta.
Incluso con una versión de compilador más nueva, a veces hace una diferencia si la omites
@synthesize propertyNameo no .En el caso de que declare una variable de instancia sin guión bajo mientras la sintetiza, como:
Encabezamiento:
Implementación:
self.someIntaccederá a la misma variable quesomeInt. No usar un guión bajo para ivars no sigue las convenciones de nomenclatura, pero acabo de encontrar una situación en la que tuve que leer y modificar dicho código.Pero si ahora piensa "Hey, @synthesize ya no es importante ya que usamos un compilador más nuevo", ¡está equivocado! Su clase resultará en tener dos ivars , es decir,
someIntmás una_someIntvariable autogenerada . Por lo tanto,self.someIntyasomeIntno abordará las mismas variables. Si no esperas tal comportamiento como lo hice, esto podría darte un dolor de cabeza para descubrir.fuente
@synchronizees una directiva sobre cómo sincronizar subprocesos al acceder a la propiedad y@synthesizees para vincular la propiedad a una variable de instancia a través de getters y setters.Autosynthesized property 'someInt' will use synthesized instance variable '_someInt', not existing instance variable 'someInt'. (No sé en qué versión de xcode se agregó esta advertencia).Según la documentación de Apple, @Synthesize se usa solo para cambiar el nombre de las variables de instancia. Por ejemplo
Ahora en la clase no se puede usar
_strya que la línea anterior cambia el nombre de la variable de instancia astr2@propertypermite que los objetos sean utilizados por objetos en otras clases, o en otras palabras, hace que el objeto sea público.fuente
Cuando crea una propiedad en @interface, esa propiedad se recuperará automáticamente mediante una variable de instancia denominada _propertyName. Entonces, cuando crea una propiedad llamada firstName, detrás del compilador de escena creará una variable de instancia llamada _firstName de manera predeterminada. El compilador también creará el método getter y setter para usted (es decir, firstName, setFirstName).
Ahora, cuando sintetiza la propiedad por @synthesize firstName, simplemente le está diciendo al compilador que cambie el nombre de mi variable de instancia (_firstName) por firstName. Si desea cambiar el nombre de su variable de instancia respaldada por un nombre diferente, simplemente puede asignar un nombre diferente mientras sintetiza el nombre de la propiedad (es decir, @synthesize firstName = myFirstName), al hacer esto, su propiedad está respaldada por una variable de instancia denominada como myFirstname.
En resumen, la mayoría de las veces @synthesize solía cambiar el nombre de su variable de instancia respaldada por su propiedad.
fuente
Ver los documentos de apple
Básicamente, la síntesis crea un setMapView y métodos mapView que establecen y obtienen mapView1
fuente
Crea getter y setter para su objeto. Puedes acceder con algo como esto:
o
mapView1 es el nombre del ivar en la clase, mapView es el nombre de los métodos getter / setter.
fuente