我有一个在初始化器中有这个的类:
@implementation BaseFooClass
-(id) init
{
if (self = [super init])
{
// initialize instance variables that always need to start with this value
}
return self;
}
-(id) initWithSomeIntint) 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) initWithSomeIntint) someInt
{
if (self = [super init]) // <--- Infinite loop (stack overflow )
{
// initialize other variables
}
}
@end
我基本上需要专门调用BaseFooClass 的init 而不是SubFooClass 的init 。
我无法更改对象的初始化方式,因为我正在将项目从 C# 转换为在我的 iPad 应用程序中使用。
提前谢谢大家
编辑:
由于有人问,这是我的标题:
@interface BaseFooClass : NSObject
// implicit from NSObject
// -(id) init;
-(id) initWithSomeIntint) someInt;
// more methods
@end
@interface SubFooClass : BaseFooClass
// implicit from NSObject
// -(id) init;
// implicit from BaseFooClass
//-(id) initWithSomeIntint) someInt;
@end
Best Answer-推荐答案 strong>
Objective-C 不能以这种方式工作,因为运行时将方法转换为函数调用的方式。 Self 始终是已分配类的实例,即使在调用父类(super class)的方法时也是如此。您需要为您的 BaseClassFoo 创建指定的初始化程序并始终去那里。所以你应该做这样的事情:
@implementation BaseFooClass
-(id) init
{
return [self initWithSomeInt:0]; // redirect super class's designated initializer
}
-(id) initWithSomeIntint) 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) initWithSomeIntint) someInt
{
if ((self = [super initWithSomeInt:someInt]))
{
// initialize other sub-class specific variables
}
}
@end
关于ios - Objective-C 调用特定的类方法,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/3881477/
|