Pregunta

Este es un ejemplo del objetivo-C 2.0 Lenguaje de Programación. Me preguntaba, en la incubadora en la parte inferior, puedo usar value = [newValue retain] en lugar de value = [newValue copy]?

    @interface MyClass : NSObject

{

    NSString *value;

}

@property(copy, readwrite) NSString *value;

@end



// assume using garbage collection

@implementation MyClass

@dynamic value;



- (NSString *)value {

    return value;

}



- (void)setValue:(NSString *)newValue {

    if (newValue != value) {

       value = [newValue copy];

    }

}

@end
¿Fue útil?

Solución

Lo más rápida y más segura de hacerlo sería añadir @synthesize value a la parte superior de su aplicación, y el compilador generará automáticamente estos métodos.

El tema de la copia vs. retener bisagras en el hecho de que se puede pasar en una NSMutableString, que cambiaría su valor. Si usted tiene un regulador para un tipo de 'inmutable' (cadena, conjunto, matriz, diccionario), es necesario utilizar la semántica copy. Al principio esto puede parecer contradictorio (¿por qué hacer una copia si es inmutable?), Pero la cosa es darse cuenta de que su clase quiere asumir que es inmutable, y lo que pasó en realidad no puede ser inmutable.

clases NSMutable implementar el selector copy devolviendo una versión inmutable de lo que representan. Las clases inmutables (NSString, etc.) implementan copy con una llamada retain. Es decir, son muy rápidos.

Su colocador también necesita liberar value antes de asignar un nuevo valor. El código correcto es:

-(void)setValue:(NSString*)newvalue
{
    if (value != newvalue)
    {
        [value release];
        value = [newvalue copy];
    }
}

Si usted tiene un control completo sobre todas las clases que pueden llamar setValue: y son absolutamente seguro de que no se le pasa en NSMutableString, puede utilizar retain, pero es las mejores prácticas para utilizar copy.

Otros consejos

Depende. Si utiliza [newValue retain], otro objeto puede cambiar el valor de este puntero NSString. Normalmente, no les gusta tener este comportamiento.

No, su interfaz dice copy. Si alguien pasa en un NSMutableString, obtendrá resultados muy diferentes de los dos métodos.

método setter:

  -(void)setValue:(NSString*)newvalue{
        if (_value != newvalue)
        {
            [_value release];
            _value = nil;
            _value = [newvalue copy];

        }
   }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top