Objective-C调用特定的类方法

时间:2010-10-07 12:12:45

标签: ios objective-c stack-overflow object-initialization

我在初始化程序中有一个类:

@implementation BaseFooClass

-(id) init
{
     if (self = [super init])
     {
          // initialize instance variables that always need to start with this value
     }

     return self;
}

-(id) initWithSomeInt:(int) someInt
{
     if (self = [self init]) // <-- I need to make sure that I am calling BaseFooClass's init here, not SubFooClass's, does that make sense?
     {
          self.someInt = someInt;
     }

     return self;
}

@end

这一切都很好,花花公子。我的问题是,当我实现子类时:

@implementation SubFooClass

-(id) init
{
     return [self initWithSomeInt:0];
}

-(id) initWithSomeInt:(int) someInt
{

     if (self = [super init]) // <--- Infinite loop (stack overflow :) )
     {
          // initialize other variables
     }
}

@end

我基本上需要专门拨打BaseFooClass的{​​{1}}而不是init的{​​{1}}。

我无法更改对象的初始化方式,因为我正在将项目从C#转换为在我的iPad应用程序中使用。

提前谢谢大家

编辑:

由于有人问,这是我的标题:

SubFooClass

2 个答案:

答案 0 :(得分:3)

Objective-C不能以这种方式工作,因为运行时将方法转换为函数调用的方式。 Self始终是已分配类的实例,即使在调用超类的方法时也是如此。您需要为BaseClassFoo创建指定的初始化程序并始终到那里。所以你应该做这样的事情:

@implementation BaseFooClass

-(id) init
{
  return [self initWithSomeInt:0]; // redirect super class's designated initializer
}

-(id) initWithSomeInt:(int) someInt
{
  if ((self = [super init])) // Designated initializer always calls into super class's designated initializer (in this case, NSObject's designated initializer is init
  {
    self.someInt = someInt;
  }

  return self;
}

@end

@implementation SubFooClass

// Here we don't override init because our super class's designated initializer
// is initWithSomeInt:
// -(id) init
// {
//   return [self initWithSomeInt:0];
// }

// we override this because it's our superclass's designated initializer, plus it
// is ours as well
-(id) initWithSomeInt:(int) someInt
{
  if ((self = [super initWithSomeInt:someInt]))
  {
    // initialize other sub-class specific variables
  }
}

@end

答案 1 :(得分:1)

你必须调用[super initWithSomeInt:someInt];在SubFooClass的init方法中。 ;)

增加: 我觉得你试图在iniWithSomeInt中调用init很奇怪。通常的做法是在SubFooClass的initIthSomeInt方法中调用[super initWithSomeInt:someInt]并在if子句中更改所需的内容。