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
- 是的好.."初始化器"
谢谢!
您没有从子类初始化程序中调用指定的初始化程序,这导致您需要在子类的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调用时被设置.我认为实际存在问题的可能性很低.