我有三个Objective-C类:在Objective-C中,init方法设置self时原始对象会发生什么?
@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
取决于由delegate
对象执行的ClassAProtocol
中方法的返回值。
@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
这不工作,我因为在初始化调用想要的方式,委托(Interface Builder中设置)仍然是零,所以创建的对象始终是ClassC
。此外,首先创建一个ClassA
对象,然后在其init调用中创建一个具有不同内存地址的新对象ClassC
,并且不处理对象。我有三个问题:
1)原始对象ClassA
会发生什么? (我认为它泄露了,但我想知道)。
2)如何避免泄漏?
3)我如何完成我真正想要的?在设置代理时(例如,在awakeFromNib
方法中),重置对象为时已晚。
你确定那第三个吗?为了使'initWithCoder:'工作,类需要实现'NSCoding'协议,NSObject默认情况下不支持这种协议,我的类也不做,但我没有任何问题在InterfaceBuilder中创建任何实例。另外,当我在IB中创建'ClassA'时,它经历了我在上面发布的两次初始化调用 - 首先是本身,然后是从'ClassC'调用'[super init]'。 – executor21 2010-08-10 17:58:06