Pergunta

O código a seguir compila e corre, mas de acordo com todos os livros de desenvolvimento do iPhone e documentação da Apple que não deve! Alguém por favor pode me explicar como é que imutável NSString permite alterar seus valores depois de ter sido set? Eu pensei que eu tinha que usar NSMuttableString para mudar contexto da mesma cadeia variável? Eu estou usando SDK 3.1.

NSString *test =[[NSString alloc] initWithString:@"TEST"];
[test release];
test = @"TEST2";
Foi útil?

Solução

Talvez o exemplo a seguir irá adicionar sobre as respostas de Mark e Niels e ajudar a esclarecer as coisas.

cordas imutáveis ??

// Setup two variables to point to the same string
NSString * str1 = @"Hello World";
NSString * str2 = str1;

// "Replace" the second string
str2 = @"Hello ikilimnik";

// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);

cordas mutáveis ??

// Setup two variables to point to the same string
NSMutableString * str1 = [NSMutableString stringWithString:@"Hello World"];
NSMutableString * str2 = str1;

// "Replace" the second string
[str2 setString:@"Hello ikilimnik"];

// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);

Observe quando você usa a classe NSString imutável que a única maneira de "substituir" uma string é criar uma nova seqüência e atualizar sua variável "str2" para apontar para ele. Este, porém, não afeta o "str1" está apontando para, por isso ainda fará referência ao string original.

No exemplo NSMutableString, não criamos uma segunda corda, mas em vez alter (mutação) o conteúdo da cadeia existente "Olá Mundo". Uma vez que ambas as variáveis ??continuam a apontar para o mesmo objeto string, ambos irão relatório o novo valor na chamada para NSLog.

É importante diferenciar entre uma variável ponteiro e o objeto real ele aponta. A NSString objeto é imutável, mas isso não impedi-lo de alterar o valor de uma variável que aponta para uma string.

O tipo de dados "NSString *" é um ponteiro para um objeto NSString, não o objeto em si. Se você definir um ponto de ruptura em qualquer das demonstrações NSLog dentro do depurador XCode, você pode gostar de verificar o valor bruto de cada variável para esclarecer este assunto.

Outras dicas

Você não está mutando a corda, você está apenas a reatribuição do teste variável para apontar para uma sequência diferente. A string original não foi modificado.

TESTE e TEST2 são duas cadeias diferentes apontada pelo ponteiro teste *.

Você não está mudando o conteúdo do objeto NSString explicitamente atribuídos a partir da primeira linha de código, mas apontando test * para outro objeto.

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