Какова семантика использования retain vs. copy для свойства типа NSMutableSet; - PullRequest
3 голосов
/ 30 сентября 2010

Я использую самый лучший Accessorizer для автоматического создания сеттеров / геттеров для моего кода Obj-C в Xcode.Недавно в Accessorizer было сделано изменение:

старая версия Accessorizer:
@property (неатомный, сохраняемый) NSMutableSet * setA;
@property (неатомный, сохраняющий) NSMutableSet * setB;

новая версия Accessorizer:
@property (неатомный, копия) NSMutableSet * setA;
@property (неатомный, копия) NSMutableSet * setB;

К сожалению, новая версия вылетает из моего кода.В моем коде я делаю следующее:

self.setA = [[[NSMutableSet alloc] init] autorelease];
self.setB = [[[NSMutableSet alloc] init] autorelease];

// ...

[self.setA minusSet:self.setB];  

Приведенная выше строка кода работает нормально, используя старый способ (сохранить), но вылетает, используя новыйспособ (копия).Очевидно, что-то здесь не так.Я очень полагаюсь на Accessorizer.Может ли кто-нибудь прояснить последствия использования copy / retain в контексте NSMutableSet?

Спасибо,
Даг

Ответы [ 2 ]

4 голосов
/ 30 сентября 2010

Да, это «особенность» свойств.Когда вы устанавливаете свойство, объявленное как copy, сгенерированный установщик вызовет -copy для объекта.К сожалению, в случае изменяемых объектов это приводит к неизменяемому варианту.

Другими словами, объект, возвращаемый [myMutableSet copy], является , а не изменяемым.

Если вам нужно, чтобы набор был изменяемым, то вы должны использовать retain (или переопределить установщик, чтобы использовать mutableCopy вместо copy).

Я подал ошибку в этом (rdar: // 8416047), но она была закрыта как «работает как задумано».(Потому что на самом деле нет никакого способа узнать, является ли объект изменчивым или нет)

4 голосов
/ 30 сентября 2010

Если у вас тип свойства изменяемый , вы, скорее всего, захотите сохранить. Если это неизменяемый набор (он же NSSet), в рекомендациях Apple говорится, что следует использовать копию, а не сохранять.

Различие состоит в том, что существует ожидание того, что изменчивый набор изменится. Ожидается, что неизменяемый набор останется неизменным, но если он объявлен как сохраняющий, кто-то может установить его в изменяемый набор, а затем неожиданно изменить его содержимое.

...