ETA: @DougW правильно указывает, что тип собственности свойства (assign
/ retain
/ copy
) не влияет на получателя.Это все еще влияет на сеттер.Для типов readonly
это имеет значение, если вы собираетесь переопределить часть readonly
объявления в расширении класса, чтобы вы могли использовать установщик в своей реализации.Переопределение свойства расширения класса допускается только для изменения статуса readonly
свойства, поэтому остальная его часть - что означает атомарность и типы владения - должна быть надлежащим образом объявлена в заголовке.Даже если вы не переопределяете свойство сейчас, вы можете сделать это в будущем, поэтому вы можете также задокументировать, как вы хотите управлять памятью для себя, используя правильный параметр для начала.
Автоматический подсчет ссылок (ARC) изменяет подробности реализации среды выполнения, накладывая свои собственные правила управления памятью поверх классических правил пересчета, но правила и рекомендации по настройке ваших свойств остаются прежними.
Зачем использовать retain
with readonly
? Если вы пометите свойство как retain
, синтезированный метод доступа сделает что-то вроде этого:
/* getter for retain property */
- (NSString *)name {
return [[name retain] autorelease];
}
Теперь, если объект, который вы отправили -name
, меняет имяпока вы все еще используете его, вызывающий код будет по-прежнему иметь действительную ссылку на строку.Однако если вы объявите его как assign
, это будет выглядеть так:
/* getter for assign property */
- (NSString *)name {
return name;
}
Теперь, как только объект изменит имя, он должен быть освобожден, чтобы избежать утечки, чтосделает недействительной ссылку на код вызова.retain
/ copy
/ assign
действительно заявляет о политике управления памятью: retain
/ copy
говорит: «Я обещаю, что у меня есть ссылка на оригинал / копию значения, которое я предоставляю здесь, "в то время как assign
говорит:" У меня просто есть значение, и я не требую ссылки на него. "
Когда значение не требует управления памятью, например, int
, тогда assign
имеет смысл.Если вы намеренно не сохраняете объект, такой как делегат, то assign
имеет смысл.Но в большинстве других случаев вам понадобится retain
или copy
.
Кроме того, файл реализации может переопределять только часть readwrite
/ readonly
объявления свойства, а не памятьчасть управления.Как объявлено, файл .m
может иметь:
@interface Holiday (/*class extension*/)
@property(nonatomic, retain, readwrite) NSDate *date;
/* override other properties to make them readwrite... */
@end
Непубличные установщики для объявлений переопределенных свойств будут затем синтезированы вместе с общедоступными средствами доступа.
Почему бы и нетиспользовать сеттеры / аксессоры во время -init
? Поскольку сеттеры / аксессоры часто выполняют уведомление KVO, чего следует избегать, пока ваш объект не полностью инициализирован, то есть во время -init
(когда он наполовину инициализируется на пути кполная инициализация) и -dealloc
(когда он наполовину инициализируется на пути к полной неинициализации).
Зачем использовать copy
с readonly
? Как в ответ наВаш первый вопрос: потому что если copy
против retain
против assign
влияет как на сеттеры, так и на геттеры.Получатель копии будет выглядеть так:
/* getter for copy property */
- (NSString *)name {
return [[name copy] autorelease];
}
Почему иногда copy
, а иногда retain
? copy
обычно используется с объектами-значениями (пассивные объекты, представляющие значение);retain
обычно используется с другими объектами.Иногда возникают проблемы с эффективностью (скорее всего, преждевременно ...), и вы можете использовать retain
там, где обычно используете copy
.
Как бы вы использовали copy
/ retain
вместе с readonly
здесь? Почти так же, как они.Я бы переопределил объявления в расширении класса, чтобы я мог использовать сеттеры для изменения значений свойств вне -init
и -dealloc
, где я использовал бы только прямой доступ к переменным экземпляра.Я также nil
извлеку ивары после их выпуска в -dealloc
, например,
[name release], name = nil;
Это помогает избежать отправки сообщений или иных ссылок на уже выпущенный объект.