Sí, hay una diferencia tanto para la memoria como para el rendimiento.
MyProperty = @"hi there";
Esto se considera una asignación directa. Prácticamente no hay memoria o impacto en el rendimiento. Por supuesto, eso no quiere decir que es la mejor práctica - que es una cuestión diferente :)
@property(nonatomic, copy) NSString *MyProperty;
// ...
self.MyProperty = @"hi there";
Esta declaración tiene un impacto significativo sobre la memoria y el rendimiento. Esto es esencialmente equivalente a:
-(void)setMyProperty(NSString *)newValue {
if (MyProperty != newValue) {
[MyProperty release];
MyProperty = [newValue copy];
}
}
El valor antiguo es liberado y el nuevo valor se copia en MyProperty. Esto es aceptable y especialmente típico cuando se trata de cadenas cuando la cadena que se asigna es mutable (es decir, podría cambiar más adelante).
Si, como en su ejemplo, simplemente está asignando una cadena estática (@ "hi there"), no hay nada de malo en asignar directamente el valor de cadena; es más eficiente, sin embargo, la diferencia en el rendimiento es trivial.
Puede declarar una propiedad con @property como conservar, copiar o asignar (se asigna por defecto). A continuación, puede generar métodos de "acceso" (getter/setter) utilizando @synthesize. Esto es lo que se genera la incubadora métodos parecen que cuando lo hace:
// @property(nonatomic, assign)
-(void)setMyProperty(NSString *)newValue {
MyProperty = newValue;
}
// @property(nonatomic, retain)
-(void)setMyProperty(NSString *)newValue {
if (property != newValue) {
[property release];
property = [newValue retain];
}
// @property(nonatomic, copy)
-(void)setMyProperty(NSString *)newValue {
if (property != newValue) {
[property release];
property = [newValue copy];
}
}
Más información sobre ObjectiveC Declared Properties.
"Puede utilizar las directivas @synthesize y @dynamic en bloques @implementation para desencadenar acciones específicas del compilador Tenga en cuenta que no se requiere para cualquier declaración dada @property
Importante:.. Si no se especifica o bien @ sintetizar o @dynamic para una propiedad en particular, debe proporcionar una implementación de método getter y setter (o solo getter en el caso de una propiedad de solo lectura) para esa propiedad ".
En otras palabras, si declara una propiedad pero no sintetiza la propiedad, no podrá usar [self MyProperty] o self.MyProperty a menos que defina los métodos 'MyProperty' y 'setMyProperty'. Si no declaras una propiedad, simplemente tienes una variable de instancia.
Nota: @dynamic no genera los accesos. Realmente se usa si está resolviendo dinámicamente (es decir, mágicamente) los métodos de acceso mediante el código de carga o la resolución dinámica de métodos.
"Prácticamente no hay memoria ... impacto." Esto definitivamente es incorrecto. Si asigna directamente , no se sorprenda si el valor se reemplaza por algo extraño. El uso de una propiedad, incluso para una variable utilizada solo dentro de la clase, resuelve el problema de que se le asigne algo más a la dirección de su variable ss espacio y conserva la integridad del valor de la propiedad. – 4thSpace
El "impacto" que describes no tiene nada que ver con la memoria o el rendimiento. La mala práctica, que noté en consecuencia, es una pregunta diferente;) Su comentario es incorrecto. En la pregunta, la propiedad es NSString y todas las asignaciones son constantes: @ "hi there" es una constante de NSString, no un objeto.Si escribe una aplicación que establece un valor en @ "una cadena", ya sea mediante asignar, copiar o retener, la variable siempre apuntará al mismo espacio de direcciones en la memoria. Las propiedades se utilizan para exponer variables de instancia, no gestión de memoria o direccionamiento. – nessence