Я уже слышал из нескольких источников (stackoverflow.com, cocoa -dev, документация, блоги и т.д.), что "неправильно" использовать аксессоры и настройки (foo, setFoo:) в вашем init и dealloc. Я понимаю, что существует дистанционная возможность сбивать с толку другие объекты, которые наблюдают свойство, если вы это сделаете. (простой пример приведен ниже здесь)
Однако я должен сказать, что я не согласен с этой практикой по следующей причине:
Новая среда Objective-C (одна на iPhone и 64-битная среда выполнения в 10.5) позволяет объявлять свойства без объявления соответствующего ivar. Например, следующий класс будет компилироваться просто отлично на 10,5 или для iPhone (устройство, а не симулятор):
@interface Foo : NSObject { }
@property (retain) id someObject;
@end
@implementation Foo
@synthesize someObject;
@end
Понимая, что приведенное выше является вполне допустимым классом Objective-C, скажем, я решил написать инициализатор, а для целей управления памятью - метод dealloc (поскольку GC недоступен на iPhone). Все, что я когда-либо читал об инициализаторах и освобождении, заставил бы меня написать следующие два метода:
- (id) init {
if (self = [super init]) {
//initialize the value of someObject to nil
[self setSomeObject:nil];
}
return self;
}
- (void) dealloc {
//setting someObject to nil will release the previous value
[self setSomeObject:nil];
[super dealloc];
}
Однако, согласно документации и популярному мнению, это "неправильно". Поэтому мои вопросы таковы:
- Как я могу инициализировать someObject без использования доступа? Вы могли бы сказать, что компилятор (или среда выполнения или что-то еще) гарантирует, что someObject уже установлен на ноль, но я считаю, что было бы неправильным поведением полагаться на это. Имея приличный фон в C, я видел множество ошибок из-за неправильной инициализации переменных, и это кажется немного другим.
- Как я могу освободить someObject, если я не должен использовать accessor в методе dealloc?
Если ответ на любой из них - "вы не можете", то как плохо будет использовать аксессоры в ваших методах init и dealloc?