У меня есть три класса Objective-C:
@interface ClassA : NSObject{
IBOutlet id<ClassAProtocol>delegate
//other instance variables
}
//methods
@end
@interface ClassB : ClassA{
//instance variables
}
//methods
@end
@interface ClassC : ClassA{
//instance variables
}
//methods
@end
Моя цель заключается в том, чтобы при вызове экземпляра ClassA
в коде или InterfaceBuilder фактически создавался экземпляр ClassB
или ClassC
. Будет ли это ClassB
или ClassC
, зависит от возвращаемого значения метода в ClassAProtocol
, реализованного объектом delegate
.
@implementation ClassA
static BOOL _initFromSubclass = NO;
-(id)init{
if(_initFromSubclass){
_initFromSubclass = NO;
self = [super init];
}else {
_initFromSubclass = YES;
if([delegate shouldInitClassB]){
self = [[ClassB alloc] init];
}else{
self = [[ClassC alloc] init];
}
}
return self;
}
//other methods
@end
Это не работает так, как я хотел, потому что при вызове инициализации делегат (установленный в Интерфейсном Разработчике) все еще равен нулю, и поэтому созданный объект всегда ClassC
. Кроме того, сначала создается объект ClassA
, затем при его вызове init создается новый объект ClassC
с другим адресом памяти, и объект ClassA
не освобождается. У меня три вопроса:
1) Что происходит с исходным ClassA
объектом? (Я думаю, что это утечка, но я хочу знать).
2) Как избежать утечки?
3) Как мне добиться того, чего я на самом деле хочу? Ко времени установки делегата (скажем, в методе awakeFromNib
) уже слишком поздно для сброса объекта.