Почему такие объекты, как NSString и NSNumber, нельзя перезаписать?

Есть много сообщений на одну и ту же тему, и это может быть глупым вопросом, но я не смог понять эту концепцию.

Я знаю проблемы, возникающие при назначении изменяемой строки неизменяемой, и почему я должен использовать copy, чтобы избежать этих проблем.

На самом деле я не понимаю, что именно означает, что строка NSString не может быть изменена?

Если я сделаю это:

NSString *foo = @"Hello World!";
foo = @"Hello everybody!";

Я понимаю, что я не изменяю значение foo, а заменяю старый экземпляр новым. Но как тогда определить, что я не могу переписать изменяемый объект?

ОБНОВЛЕНИЕ Я попытался запустить следующий код:

-(void)immutable
{
    NSString *myString1 = @"Hello!";
    NSString *myString2 = myString1;

    NSLog(@"myString1 address: %p", &myString1); //Prints 0xbfffdb30
    NSLog(@"myString2 address: %p", &myString2); //Prints 0xbfffdb2c

    myString2 = @"Good bye!";
    NSLog(@"myString2 address: %p", &myString2); //Prints 0xbfffdb2c

    NSMutableString *myMutableString = [NSMutableString stringWithString:@"Hello"];
    NSString *myString3 = myMutableString;

    NSLog(@"myMutableString address: %p", &myMutableString); //Prints 0xbfffdb28
    NSLog(@"myString3 address: %p", &myString3); //Prints 0xbfffdb24

    [myMutableString setString:@"Hello World"];
    NSLog(@"myString3: %@", myString3); //Prints Hello World

    myString3 = myString1;
    NSLog(@"myString3 address: %p", &myString3); //Prints 0xbfffdb24

    [myMutableString setString:@"Nothing to do"];
    NSLog(@"myString3: %@", myString3); //Prints Hello!
}

Я не удивлен, что адреса myString1 и myString2 различны, так как оба являются неизменяемыми объектами. Но даже после назначения другой строки myString2, она по-прежнему указывает на тот же адрес, что и раньше. Разве это не должно измениться?

Но в случае myMutableString и myString3 они по-прежнему имеют разные адреса, даже если любое изменение в myMutableString будет отражено в myString3. После того, как я назначил myString1 для myString3, адрес, на который указывает myString3, не изменится, но он больше не будет связан с myMutableString, так как каждое внесенное в него изменение больше не будет отражаться в myString3. Что вызывает связывание myString3 и myMutableString в первую очередь?

1 ответ

Решение

Когда ты пишешь foo = @"Hello World!";Фу указывал на NSString объект, который имеет данные "Hello World!"допустим, что этот объект находится по адресу 10.

Когда ты пишешь foo = @"Hello everybody!", foo теперь указывает на новый объект, который имеет данные "Hello everybody!"скажем, этот объект находится по адресу 50. Первый объект вообще не был изменен, вы просто указали foo на другой объект по другому адресу.

Если бы эти строки были изменяемыми, вы могли бы изменить содержимое,

NSMutableString *foo = @"Hello World!".mutableCopy; //LEt's say, it's @ adress 10
[foo appendString:@"How is it going?"]; // IT's still @ adress 10, but with new content.

foo теперь указывает на объект по адресу 10, который изменил содержимое "Hello World!How is it going?",

В первом случае вы не могли изменить NSString потому что это не дает вам никаких методов для изменения данных по этому адресу. Это неизменность. NSMutableString с другой стороны, дает вам эту способность такими методами, как appendString: а также appendString:, Таким образом, вы можете изменить содержимое объекта по тому же адресу, не создавая новый объект для внесения этих изменений.

Другие вопросы по тегам