Я начал небольшой проект Xcode, чтобы выяснить, должно ли свойство NSMutableString
быть copy
или retain
. Я объявил свою собственность с атрибутом copy
:
@property (nonatomic,copy) NSMutableString *stringA;
Затем инициализировал его как self.stringA = [NSMutableString new];
наконец-то попробовал установить строку [stringA setString:@"A"];
.
Однако программа дает,
«Завершение работы приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: 'Попытка изменить неизменяемый объект с помощью setString:'»
Это потому, что результирующая строка - это NSString
? Означает ли это, что я должен объявлять свои NSMutableString
свойства, используя атрибут retain
, и свойства NSString
, используя copy
?
copy
для NSStrings. - person Hot Licks   schedule 16.08.2012return [self retain]
без создания глубокой копии. - person justin   schedule 16.08.2012-[NSMutableString copy]
создает неизменяемую копию. для изменяемой копии вы должны использоватьmutableCopy
.mutablecopy
не является спецификатором свойства. так что это больше похоже на крайний случай, который не поддерживается свойствами objc, и он редко бывает полезен или желателен. изменяемый ivar, если это действительно необходимо, обычно должен быть полностью закрытым. в большинстве случаев неизменный - правильный выбор. кроме того, вы часто не хотите сохранять строку, полученную из неизвестного источника; вы захотите скопировать его, потому что он может быть изменяемым. - person justin   schedule 16.08.2012