2010-08-10 35 views
1

我有三个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中的ClassBClassC实例实际上创建。是否为ClassBClassC取决于由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方法中),重置对象为时已晚。

回答

3
  1. 是的我认为它会被泄漏,因为它在alloc后保留+1,但没有任何东西会释放它。

  2. 在重新分配self的值之前,您可以使用[self release]。有人认为直接应该是[self dealloc],但我个人更喜欢前者。

  3. 从笔尖实例化的对象发送initWithCoder:消息我认为,所以覆盖,而不是init。虽然在这一点上,我还不确定是否会设置delegate

+0

你确定那第三个吗?为了使'initWithCoder:'工作,类需要实现'NSCoding'协议,NSObject默认情况下不支持这种协议,我的类也不做,但我没有任何问题在InterfaceBuilder中创建任何实例。另外,当我在IB中创建'ClassA'时,它经历了我在上面发布的两次初始化调用 - 首先是本身,然后是从'ClassC'调用'[super init]'。 – executor21 2010-08-10 17:58:06

相关问题