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

Nic*_*ick -1 iphone objective-c ios

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

@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; }
Run Code Online (Sandbox Code Playgroud)

我有这个对象的子类,我已经覆盖了这个构造函数(可能是错误的):

@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;
    }
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当创建子类的实例(在本例中为AtomContent)时,我会返回超类的实例,因此调用超类方法而不是子类中的方法.看看我的子类构造函数,其显而易见的原因.我的问题是我如何属性实现子类构造函数,所以超类是init'd但是对'self'的引用是对子类的?我不应该覆盖构造函数,而是使用setter来设置对象状态吗?

更正

我找回了超类的一个实例,从而获得了超类

-没有.具体来说,我的问题是使用基类实现(NSXMLParser委托方法)而不是子类'.实际上,我返回了子类的一个实例.

constructor

- 是的好.."初始化器"

谢谢!

Car*_*zey 6

您没有从子类初始化程序中调用指定的初始化程序,这导致您需要在子类的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;
}
Run Code Online (Sandbox Code Playgroud)

我应该补充一点,如果你真的得到了返回的超类的一个实例,那么你的问题就是分配,而不是初始化,因为isa指针因此方法查找表被设置在内部alloc,因此在init调用时被设置.我认为实际存在问题的可能性很低.