Qual é a melhor maneira de usar Propriedades Obj-C 2.0 com objetos mutáveis, como NSMutableArray?

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

Pergunta

Eu tenho uma classe Obj-C 2.0 que tem uma propriedade NSMutableArray. Se eu usar o código a seguir, então o setter sintetizado vai me dar uma cópia imutável, não uma mutável:

@property (readwrite, copy) NSMutableArray *myArray;

Existe alguma razão que a Apple não implementar a seguinte sintaxe?

@property (readwrite, mutablecopy) NSMutableArray *myArray;

Uma vez que não temos mutablecopy, qual é a melhor maneira de lidar com esta situação (aparentemente comum)? Devo apenas escrever meu próprio setter que faz um -mutableCopy?

Foi útil?

Solução

Como disse antes, o maneira correta para fazê-lo não é fazer com que a matriz mutável uma propriedade. Há uma grande explicação sobre o que você deve implementar para ser KVC compatível aqui .

Outras dicas

Eu corri para o mesmo problema há algum tempo e encontrei um documento no Apple Developer Connection recomendar a fornecer sua própria implementação do setter. Exemplo de código formar o 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];
    }
}

Não é comum para passar ao redor NSMutableArrays em Cocoa. prática Cacau padrão seria implementar o valor-chave de codificação compatível métodos para uma propriedade indexada para-muitos. Isto tem dois benefícios:

  1. Key-value observando obras como esperado (existem vários casos em que observem um leads NSMutableArray para não que-você-quer um comportamento)
  2. A implementação de sua estrutura de dados está escondido porque você expõe métodos mutantes (por exemplo -[MyObject insertObjectInMyProperty:(id)newObject atIndex:(NSUInteger)i], não a estrutura de dados em si.

Tenha em mente que passar em torno de uma matriz mutável não é realmente uma prática comum em Cocoa. Você pode usar uma matriz mutável privado como armazenamento interno, mas criar métodos usando plain NSArray objetos para adicionar ou obter objetos fora dele. Isto pode ser porque não há nenhuma declaração de propriedade mutableCopy.

Você tem que escrever o seu próprio setter.

A maneira correta de segurar uma NSMutableArray é com uma reter propriedade:

@property (nonatomic, retain) NSMutableArray *myArray;

Você não precisa escrever seu próprio setter ou o uso da cópia. A propriedade cópia deve ser usado com um NSArray que realmente não precisa ser copiado quando a propriedade é capturado em outro objeto. Por exemplo, se você atribuir um objeto NSMutableArray a uma propriedade que é do tipo NSArray com a propriedade cópia, então você quer fazer uma cópia da matriz mutável para "capturar"-lo como uma propriedade imutável a partir desse ponto em diante.

E Marc tem a abordagem correta, seria normalmente não fazem NSMutableArray uma parte da API pública de seus objetos. Se você tem uma propriedade pública, que pode ser um NSArray com a propriedade cópia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top