如何在Objective-C中正确实现子类构造函数

时间:2013-09-04 19:39:53

标签: iphone ios objective-c

我有一个基类,他的构造函数在给定一些外部数据的情况下设置对象状态:

@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”

谢谢!

1 个答案:

答案 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时设置。我认为实际存在问题的可能性很小。