- init
{
self = [super init];
if (self != nil) {
// initialization here
}
return self;
}
Если у вас есть «инициализаторы покрытия», они должны следовать тому же шаблону:
- initWithBob:(Bob*)aBob
{
self = [self init];
if ( self != nil ) {
... deal with aBob here ...
}
return self;
}
Это также хороший пример того, почему разумно избегать нескольких инициализаторов в классе.Отслеживание может быть затруднительным и делает подклассы более утомительными и подверженными ошибкам.Лучше иметь один инициализатор и несколько подклассов или иметь один инициализатор и позволить конфигурировать экземпляры после факта.
Т.е. вместо initWithBob:
, иметь @property(retain) Bob* bob;
, который можно вызывать после init
какнеобходимо.Хорошим правилом является ограничение инициализаторов до требуемого состояния.
Предполагая, что вы объявляете класс Car, я бы сделал что-то вроде:
@interface Car:NSObject
+ car;
+ carWithEngine:(Engine*)anEngine;
- initWithEngine:(Engine*)anEngine;
@end
Реализации должны быть очевидны;car
создает механизм по умолчанию и вызывает alloc/initWithEngine:/autorelease
.
Это дает вам один инициализатор, что делает простое подклассирование очевидным.