NSString копия не копирует? - PullRequest
7 голосов
/ 26 марта 2010
  NSString *myString = @"sample string";
  NSString *newString = [myString copy];

Если я установлю точку останова после этих двух строк, указатель для myString будет таким же, как указатель для newString.

WTF? Разве копия NSString не должна возвращать указатель на новый объект? Или я упускаю что-то фундаментальное о том, как копирование должно работать?

Ответы [ 4 ]

9 голосов
/ 26 марта 2010

Поскольку NSString является не изменяемым , оно может просто внутренне увеличить ref count и покончить с этим.

Когда вы release используете одну из этих строк NSS, она может просто уменьшать ref count - стандартное управление памятью.

Видите ли вы какие-либо проблемы с этим?

7 голосов
/ 11 апреля 2011

Подумайте об этом: NSMutableString - это подкласс NSString. Когда ваша собственность объявлена ​​как NSString, вы не ожидаете, что она изменится.

Подумайте, если вы использовали retain, и кто-то дал вам NSMutableString, а потом изменил его, ваш класс будет нарушен.

Однако вы можете подумать, что всегда copy медленный. Так что NSString s copy просто вызывает retain. NSMutableString s copy делает фактическую копию.

Обычно лучше выдать плевок NSString *, потому что людям не придется постоянно его копировать.

2 голосов
/ 13 декабря 2014

Вы можете выделить новую переменную, как в примере

NSString *anotherString = [[NSString alloc] initWithString:originalString];
1 голос
/ 11 июня 2012

Рекомендуется копировать строковое значение, возвращаемое методом, поскольку возвращаемое значение может быть изменяемым строковым объектом, и это значение может быть изменено в другом потоке после возврата этим методом.

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