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 mapView
y mapView1
? ¿Crea un método set
y get
para mapView1
?
iphone
objective-c
Hoang Duy Nam
fuente
fuente
Respuestas:
En su ejemplo,
mapView1
es una variable de instancia (ivar), un almacenamiento de memoria que pertenece a una instancia de la clase definida enexample.h
yexample.m
.mapView
es 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@property
declaració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= mapView1
parte, 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
@synthesize
declaració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
@synthesize
declaració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
@synthesize
crea un getter y un setter para la variable.Esto le permite especificar algunos atributos para sus variables y cuando
@synthesize
esa 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
init
odealloc
o 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 propertyName
o no .En el caso de que declare una variable de instancia sin guión bajo mientras la sintetiza, como:
Encabezamiento:
Implementación:
self.someInt
accederá 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,
someInt
más una_someInt
variable autogenerada . Por lo tanto,self.someInt
yasomeInt
no abordará las mismas variables. Si no esperas tal comportamiento como lo hice, esto podría darte un dolor de cabeza para descubrir.fuente
@synchronize
es una directiva sobre cómo sincronizar subprocesos al acceder a la propiedad y@synthesize
es 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
_str
ya que la línea anterior cambia el nombre de la variable de instancia astr2
@property
permite 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