2009-05-03 15 views
12

Tengo una clase Obj-C 2.0 que tiene una propiedad NSMutableArray. Si utilizo el siguiente código, a continuación, el colocador sintetizado me dará una copia inmutable, no un mutable uno:¿Cuál es la mejor manera de usar Obj-C 2.0 Properties con objetos mutables, como NSMutableArray?

@property (readwrite, copy) NSMutableArray *myArray; 

¿Hay alguna razón que Apple no puso en práctica 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 simplemente escribir mi propio setter que hace un -mutableCopy?

Respuesta

4

Como se ha dicho antes, la manera correcta de hacerlo no es hacer la matriz mutable una propiedad. Hay una gran explicación de lo que debe implementar para cumplir con KVC here.

+0

En esta respuesta http://stackoverflow.com/a/14814973/104790 presento una solución que expone las colecciones mutables sin romper la encapsulación. La respuesta no es adecuada para esta pregunta aquí porque es solo para propiedades 'readonly'. –

+0

El enlace no está activo. – Krishnan

+0

Como dijo @Krishnan, el enlace ya no funciona.:-( –

1

Tendrá que escribir su propio setter.

14

Me encontré con el mismo problema hace algún tiempo y encontré un document on the Apple Developer Connection recomendando proporcionar su propia implementación del setter. 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]; 
    } 
} 
3

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

5

No es común pasar alrededor de NSMutableArray s en Cocoa. La práctica estándar de Cocoa sería implementar la codificación de clave-valor que cumple con methods para una propiedad indexada a-muchos. Esto tiene dos ventajas: las obras de observación

  1. clave-valor como se esperaba (hay varios casos en los que la observación de un NSMutableArray lleva a no lo-que--quiero comportamiento)
  2. La implementación de la estructura de datos está oculto porque lo exponen métodos mutación (por ejemplo -[MyObject insertObjectInMyProperty:(id)newObject atIndex:(NSUInteger)i], no la estructura de datos en sí.
0

La forma correcta de aferrarse a una NSMutableArray es decir, con una propiedad de retener:

@property (nonatomic, retain) NSMutableArray *myArray; 

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

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

Cuestiones relacionadas