ios - Objective-C调用特定类方法

标签 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

我基本上需要专门调用 BaseFooClassinit 而不是 SubFooClassinit

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

先谢谢大家了

编辑:

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

@interface BaseFooClass : NSObject

// implicit from NSObject
// -(id) init;

-(id) initWithSomeInt:(int) someInt;

// more methods

@end

@interface SubFooClass : BaseFooClass

// implicit from NSObject
// -(id) init;

// implicit from BaseFooClass
//-(id) initWithSomeInt:(int) someInt;


@end

最佳答案

Objective-C 不会以这种方式工作,因为运行时将方法转换为函数调用的方式。 Self 始终是分配的类的实例,即使在调用父类(super class)的方法时也是如此。您需要为 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

关于ios - Objective-C调用特定类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3881477/

相关文章:

ios - 在 DBAccess 中关联两个对象

iOS - 我可以禁用 cell.textLabel.text 的辅助功能吗?

ios - 阻止旧手机安装我的应用程序

iphone - 如何在 xcode 中使用相同的 nib 文件创建多个窗口

java - 提交表单时出现 HtmlUnit StackOverflowError

c - C 标准是否定义了堆栈溢出行为?

python - 致命的Python错误: Cannot recover from stack overflow

objective-c - 随机数选择器总是只在应用程序首次启动时选择相同的数字

objective-c - 使用 UISegmentedControl 切换到 MKMapView 和 UITableView

objective-c - 使用 NSDictionary 还是创建一个具有属性的类?