¿Cuál es la mejor manera de usar las propiedades de Obj-C 2.0 con objetos mutables, como NSMutableArray?

StackOverflow https://stackoverflow.com/questions/816720

Pregunta

Tengo una clase Obj-C 2.0 que tiene una propiedad NSMutableArray. Si uso el siguiente código, el setter sintetizado me dará una copia inmutable, no mutable:

@property (readwrite, copy) NSMutableArray *myArray;

¿Hay alguna razón por la que Apple no implementó la siguiente sintaxis?

@property (readwrite, mutablecopy) NSMutableArray *myArray;

Dado que no tenemos mutablecopy , ¿cuál es la mejor manera de manejar esta situación (aparentemente común)? ¿Debo escribir mi propio setter que hace -mutableCopy?

¿Fue útil?

Solución

Como se dijo antes, la forma correcta de hacerlo es no hacer que la matriz mutable sea una propiedad. Hay una gran explicación de lo que debe implementar para ser compatible con KVC aquí .

Otros consejos

Me encontré con el mismo problema hace algún tiempo y encontré un documento en la Conexión de desarrollador de Apple que recomienda proporcionar su propia implementación del configurador. Ejemplo de código del documento vinculado:

@interface MyClass : NSObject {
    NSMutableArray *myArray;
}
@property (nonatomic, copy) NSMutableArray *myArray;
@end

@implementation MyClass

@synthesize myArray;

- (void)setMyArray:(NSMutableArray *)newArray {
    if (myArray != newArray) {
        [myArray release];
        myArray = [newArray mutableCopy];
    }
}

No es común pasar NSMutableArray s en Cocoa. La práctica estándar de Cocoa sería implementar el código clave-valor compatible con métodos para una propiedad indexada a muchos. Esto tiene dos beneficios:

  1. La observación de valor clave funciona como se esperaba (hay varios casos en los que observar un NSMutableArray conduce a un comportamiento que no es lo que quiere)
  2. La implementación de su estructura de datos está oculta porque expone métodos de mutación (por ejemplo, - [MyObject insertObjectInMyProperty: (id) newObject atIndex: (NSUInteger) i] , no la estructura de datos en sí misma.

Tenga en cuenta que transmitir una matriz mutable no es realmente una práctica común en Cocoa. Puede usar una matriz mutable privada como almacenamiento interno, pero cree métodos utilizando objetos NSArray simples para agregar o extraer objetos de ella. Esta puede ser la razón por la cual no hay una declaración de propiedad de mutablecopy.

Tendrás que escribir tu propio setter.

La forma correcta de aferrarse a un NSMutableArray es con una propiedad de retención:

@property (nonatomic, retain) NSMutableArray *myArray;

No necesita escribir su propio setter o usar una copia. La propiedad de copia se debe usar con una NSArray que realmente necesita copiarse cuando la propiedad se captura en otro objeto. Por ejemplo, si asigna un objeto NSMutableArray a una propiedad de tipo NSArray con la propiedad copy, entonces desea hacer una copia de la matriz mutable para " captura " como una propiedad inmutable desde ese punto en adelante.

Y Marc tiene el enfoque correcto, uno normalmente no haría que NSMutableArray sea parte de la API pública de sus objetos. Si tiene una propiedad pública, puede ser una NSArray con la propiedad de copia.

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