При компиляции с ARC рекомендуется использовать свойства copy
для типов данных, таких как NSString
. Я не мог найти правильную документацию по использованию copy
в режиме ARC. Может ли кто-нибудь сказать мне, что применимо для ARC?
Должно ли свойство NSString в ARC быть сильным или копировать?
Ответ 1
По-прежнему рекомендуется копировать, потому что вы хотите избежать того, что передаете изменяемую строку, а затем меняете ее, не зная. Копия гарантирует, что строка, которая у вас есть, не изменится.
Ответ 2
Копирование и ARC ортогональны: вы копируете изменяемые объекты для "замораживания" своего состояния; ARC отслеживает количество ссылок на объекты.
NSString
объекты могут быть или не быть изменяемыми. Когда вы получаете NSString*
в качестве параметра, вы не можете быть уверены, что он неизменен, если вы не проверите его тип (и даже тогда вы можете получить ложные срабатывания). Если ваш алгоритм полагается на строку, не меняющуюся после ее установки, сделать копию - это правильная вещь. ARC, с другой стороны, гарантирует, что объект не будет выпущен, пока вы держите ссылку на него.
Ответ 3
Не имеет значения, используете ли вы ARC или не-ARC.
Обоснование copy
заключается в том, что вы можете гарантировать, что внутреннее состояние вашего класса не может быть изменено вне реализации.
Это может произойти, если кто-то передаст вам NSMutableString
, а затем изменит его позже. Это соображение не зависит от среды управления памятью.
Ответ 4
copy
считается strong
. Использование:
@property (неатомный, копия) NSString * name;
https://devforums.apple.com/message/654033#654033
или даже:
@property NSString * firstName;