objective-c - para - que significa alt en una imagen
No se especifica el atributo NSString no ''assign'', ''retain'' o ''copy'' (5)
Estoy declarando una propiedad NSString en una clase y Object-c se queja de que:
No se especifica el atributo NSString no ''assign'', ''retain'' o ''copy''
Luego, casualmente, me hace saber que "asignar se usa en su lugar".
¿Puede alguien explicarme la diferencia entre asignar , retener y copiar en términos de funciones normales de gestión de la memoria C ?
Cocoa utiliza el recuento de referencias para administrar la memoria. Los objetos con un recuento de referencia de 0 se eliminan.
- Asignar: no hace nada para referenciar conteo simplemente apunta su variable a los datos
- retener - apunta su variable a los datos y agrega 1 a la cuenta de referencia, se garantiza que los datos estarán allí mientras su variable esté viva
- copiar: hace una copia de los datos, apunta su variable y hace que el conteo retenga 1
Más detalles aquí , en la propia documentación de Apple.
Consulte también El lenguaje de programación Objective-C para la palabra oficial sobre lo que significa cada uno de esos términos en una declaración de propiedad.
La diferencia entre asignar, retener y copiar es la siguiente:
1) asignar
- Asignar es el predeterminado y simplemente realiza una asignación de variable
- assign es un atributo de propiedad que le dice al compilador cómo sintetizar la implementación del setter de la propiedad
2) retener
- se retiene, el valor anterior se libera y se asigna
- retener especifica que el nuevo valor debe enviarse -retener en la asignación y el valor anterior enviado -release
3) copiar
- Se requiere copia cuando el objeto es mutable.
- copy especifica que el nuevo valor debe enviarse -copy en la asignación y el valor anterior enviado -release.
- copy es como retener devuelve un objeto que debe liberar explícitamente (por ejemplo, en dealloc) en entornos no recolectados.
- si usa copy, aún necesita liberar eso en dealloc.
- Úselo si necesita el valor del objeto tal como está en este momento, y no quiere que ese valor refleje ningún cambio realizado por otro
- dueños del objeto. Tendrá que liberar el objeto cuando haya terminado con él porque está reteniendo la copia.
assign
- el ivar se establece haciendo una asignación simple. Implementación:
- (void) setFoo:(NSString *)newFoo {
foo = newFoo;
}
retain
- el ivar se envía al mensaje de retención antes de realizar la tarea. Implementación:
- (void) setFoo:(NSString *)newFoo {
if (foo != newFoo) {
[foo release];
foo = [newFoo retain];
}
}
copy
- al ivar se le envía el mensaje de copia antes de realizar la tarea. Implementación:
- (void) setFoo:(NSString *)newFoo {
if (foo != newFoo) {
[foo release];
foo = [newFoo copy];
}
}
Creo que está llamando su atención sobre el hecho de que se está utilizando una assign
, en lugar de retain
o copy
. Como un NSString
es un objeto, en un entorno de referencia contada (es decir, sin recolección de basura), esto puede ser potencialmente "peligroso" (a menos que sea intencional por diseño).
Sin embargo, la diferencia entre assign
, retain
y copy
es la siguiente:
assign : en su método setter para la propiedad, hay una asignación simple de su variable de instancia al nuevo valor, por ejemplo:
- (void)setString:(NSString*)newString { string = newString; }
Esto puede causar problemas ya que los objetos de Objective-C usan recuento de referencias y, por lo tanto, al no conservar el objeto, existe la posibilidad de que la cadena se desasignara mientras usted todavía la está utilizando.
retener : esto conserva el nuevo valor en su método setter. Por ejemplo:
- (void)setString:(NSString*)newString { [newString retain]; [string release]; string = newString; }
Esto es más seguro, ya que declara explícitamente que desea mantener una referencia del objeto, y debe liberarlo antes de que sea desasignado.
copiar : esto hace una copia de la cadena en su método setter:
- (void)setString:(NSString*)newString { if(string!=newString) { [string release]; string = [newString copy]; } }
Esto se usa a menudo con cadenas, ya que hacer una copia del objeto original garantiza que no se cambie mientras lo está usando.