Свойство NSString делает мелкую копию - PullRequest
2 голосов
/ 28 июля 2011

У меня возникли проблемы с пониманием того, что происходит с этими двумя строковыми свойствами, объявленными в отдельных классах:

@property (nonatomic, copy) NSString *userPhone;

и

@property (nonatomic, copy) NSString *userLogin;

Где-то в коде я иду и делаю следующее:

user.userPhone = self.userLogin;

Я ожидаю, что userLogin будет скопирован в новый объект и назначен на userPhone.Однако я обнаружил, что они оба имеют ссылку на один и тот же объект!Поэтому, когда userLogin выпускают, так же, как и userPhone, ломая мое плохое приложение.

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

Кто-нибудь знает?

Большое спасибо

Ответы [ 2 ]

7 голосов
/ 28 июля 2011

NSString объекты являются неизменными , что означает, что их содержимое не может измениться после их создания. Чтобы использовать это, метод copy не создает новую строку. Вместо этого он сохраняет исходную строку *. С вашей точки зрения, это внутренняя оптимизация применяются стандартные правила управления памятью. Если у вас проблемы с тем, что строка dealloc изменена раньше, чем вы ожидаете, вы должны перевыпустить ее где-то еще.

stringWithString: также внутренне оптимизируется таким же образом. Если вы передадите неизменную строку в качестве аргумента, она не создаст новую *. Если вы выполните следующий код, вы увидите, что адреса string1 и string2 совпадают.

NSString *string1 = @"Test";
NSString *string2 = [NSString stringWithString:string1];
NSLog(@"%p, %p",string1, string2);

(*) Это детали реализации, которые могут быть изменены в любое время.

0 голосов
/ 28 июля 2011

Вы можете дважды выпустить оригинал. Если я помню, свойство copy на самом деле просто сохранит неизменную копию (т.е. NSString) и сделает печатную копию, только если она изменчива (NSMutableString). Возможно, исходная строка автоматически выпущена, и вы дадите ей полную версию, учитывая два уменьшения. Edit:

После прочтения других постов я изменил свой, чтобы отразить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...