Pergunta

Eu li que os tipos de dados não mutáveis ​​​​não podem ser modificados depois de criados (por exemplo, NSString ou NSArray).

Mas eles podem ser reinicializados para apontar para um conjunto diferente de objetos?

Em caso afirmativo, devo usar release para liberar qualquer alocação da primeira vez entre os usos?por exemplo:

myArray declarado como NSArray *myArray na interface e como nonatomic/retain property.myArray definido no código de inicialização para um ponto para uma matriz de strings como segue.

self.myArray = [myString componentsSeparatedByString:@","];

Mais tarde, porém, quero reinicializar myArray para apontar para um conjunto diferente de strings

self.myArray = [myOtherString componentsSeparatedByString:@","];

É possível?Obrigado...

Foi útil?

Solução

Sim, você pode reinicializar o NSArray.Aqui está o código de exemplo que usei para reinicializar o NSArray.

NSString *keywords = @"FirstName|LastName|Address|PhoneNumber";
NSArray *arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"First Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
                                  [arr objectAtIndex:2],[arr objectAtIndex:3]);
arr = nil;

keywords = @"First_Name|Last_Name|_Address|_PhoneNumber";
arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"Second Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
                                   [arr objectAtIndex:2],[arr objectAtIndex:3]);

Outras dicas

Realmente depende do que você quer dizer com reinicializar.Você pode atribuir outro objeto imutável para um ponteiro, porque os ponteiros não são constantes.

Exemplo:

@interface MyObj : NSObject {
    NSString *name;                    // not needed in 64bit runtime AFAIK
}
@property(retain) NSString *name;      // sane people use copy instead of retain
                                       // whenever possible. Using retain can
                                       // lead to some hard to find errors.
@end

/* ... another file ... */

MyObj *theObject = [[[MyObj alloc] init] autorelease];

theObject.name = @"Peter";
NSString *oldName = theObject.name;

NSLog(@"%@", theObject.name);   // -> Peter
NSLog(@"%@", oldName);          // -> Peter

theObject.name = @"Martin";
NSLog(@"%@", theObject.name)    // -> Martin
NSLog(@"%@", oldName)           // -> Peter

Se o comportamento acima for o que você deseja, tudo bem.

Se você quiser que a última linha retorne Martinho estás em sarilhos. Essas são strings constantes e são não destinado a ser modificado.Você poderia, se realmente quiser, modificar a memória do objeto diretamente, mas isso é perigoso e não recomendado.Use objetos mutáveis ​​se precisar de tal comportamento.

Claro que podem.Dizendo que um NSArray é imutável não significa que um atributo de uma classe desse tipo não possa ser alterado.Você não pode alterar o conteúdo, mas pode atribuir novo conteúdo a ele.

Se você quiser impossibilitar também a alteração da referência, você deve usar const palavra-chave.

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