Two Stage Creation
Разделение этапа создания объекта на два: выделение памяти и инициализация.
[[SomeClass alloc] init].
Преимущества:
- инициализация независимо от способа выделения памяти (alloc),
- небольшое количество инициализаторов, которое нужно переопределить при создании подкласса,
- удобство при создании временных экземпляров.
Должен быть один или несколько Designated Initializer. Он как правило имеет больше всего аргументов и его вызывают все остальные инициализаторы. Designated Initializer обязан вызвать Designated Initializer своего базового класса.
@interface MYCircle : NSObject
{
NSPoint center;
float radius;
}
// Designated Initializer
- (id)initWithCenter:(NSPoint)aPoint radius:(float)aRadius;
@end
@implementation MYCircle
// Designated Initializer
- (id)initWithCenter:(NSPoint)aPoint radius:(float)aRadius
{
self = [super init];
if(nil != self)
{
center = aPoint;
radius = aRadius;
}
return self;
}
@end
В каждый метод добавляются два скрытых параметра: self и _cmd.
Правила при работе с Designated Initializer (DI):
- DI должен вызывать DI своего базового класса
- self-у должен быть присвоен результат выполнения DI базового класса
- Нужно проверить не вернул ли DI базового класса nil.
- DI должен переопределить DI базового класса.
- Все остальные инициализаторы должны вызывать DI.
Creating Temporary Instances
+ (id)stringWithString:(NSString *)aString
{
return [[[self alloc] initWithString:aString] autorelease];
}
Основная особенность в том, что созданный временный объект будет удален автоматически, если клиент не возьмет владение (retain) на себя.
Комментариев нет:
Отправить комментарий