Использование прямого доступа в частично построенных состояниях независимо от ARC:
- (id)initWithReminder:(Reminder*)reminder_ {
self = [super init];
if (self) {
reminder = reminder_;
// OR
reminder = [reminder_ retain];
}
return self;
}
Это связано с тем, что self.whatever
вызовет другие побочные эффекты, такие как уведомления о значении ключа (KVO) или, возможно, вашкласс реализует (явно) или подкласс переопределяет setWhatever:
- и это может предоставить ваш частично инициализированный экземпляр другим API (включая его собственный), которые справедливо предполагают, что они имеют дело с полностью созданным объектом.
Вы может вручную проверить, что класс способен работать в частично инициализированном состоянии, но это требует большого обслуживания и (откровенно) нецелесообразно или невозможно, когда другие люди хотят подкласса вашего класса.Это требует много времени и обслуживания, и при этом нет существенной выгоды, особенно если вы пытаетесь использовать этот подход в качестве соглашения.
Таким образом, единый способ, который гарантирует правильность, заключается в использовании прямого доступа вчастично построенные состояния и избегайте использования методов доступа.
Примечание: я использую «частично построенные», потому что инициализация - только половина изображения;-dealloc
имеет аналогичные предостережения.
Более подробную информацию о том, почему вы должны использовать прямой доступ в частично построенных состояниях (ARC || MRC), можно найти здесь: Инициализация свойства, точечная запись