我有一个基类,他的构造函数在给定一些外部数据的情况下设置对象状态:
@implementation XMlContent
- (id)initWithParser:(NSXMLParser *)xmlParser {
self = [super init];
if (self) {
if(xmlParser != nil){
_documentFormat = @"xml";
_xmlParser = xmlParser;
xmlParser.delegate = self;
} else{
return nil;
}
}
return self; }
我有这个对象的子类,我已经像这样重写了这个构造函数(可能是错误的):
@implementation AtomContent
- (id)initWithParser:(NSXMLParser *)xmlParser
{
self = [super init];
if (self) {
if(xmlParser != nil){
self.xmlParser = xmlParser;
self.xmlParser.delegate = self;
self.documentFormat = @"atom";
} else{
return nil;
}
}
return self;
}
我遇到的问题是,在创建子类的实例(在本例中为AtomContent)时,我会返回超类的实例,因此调用超类方法而不是子类中的方法。看看我的子类构造函数,其显而易见的原因。我的问题是我如何属性实现子类构造函数,所以超类是init'd但是对'self'的引用是对子类的?我不应该覆盖构造函数,而是使用setter来设置对象状态吗?
更正
我找回了超类的一个实例,因此超类
-No。具体来说,我的问题是使用基类实现(NSXMLParser委托方法)而不是子类'。实际上,我已经返回了子类的一个实例。
构造
-Yeah ok ..“Initializer”
谢谢!
答案 0 :(得分:5)
您没有从子类初始化程序中调用指定的初始化程序,这导致您需要在子类的initWithXMLParser:
实现中重复大量工作。我就是这样做的:
// Superclass
- (id)initWithParser:(NSXMLParser *)xmlParser {
self = [super init];
if (self) {
if(xmlParser != nil) {
_documentFormat = @"xml";
_xmlParser = xmlParser;
xmlParser.delegate = self;
}
else {
return nil;
}
}
return self;
}
// Subclass
- (id)initWithParser:(NSXMLParser *)xmlParser
{
self = [super initWithParser:xmlParser];
if (self) {
self.documentFormat = @"atom";
}
return self;
}
我应该补充说,如果你真的得到了返回的超类的实例,那么你的问题就是分配,而不是初始化,因为isa
指针,因此方法查找表设置在{{1因此在调用alloc
时设置。我认为实际存在问题的可能性很小。