目标C:覆盖init的警告

时间:2010-02-26 06:15:40

标签: objective-c inheritance instantiation

我有一个'DOInstance'类,后来我继承了它。这是它的声明:

@interface DOInstance : NSObject {

}

- (DOInstance *) initWithSynckey:(NSString *)_synckey;
@end

然后我有一个DOInstance的子类:

@interface Workflow_Workitem_Header_1px: DOInstance {

}
//- (Workflow_Workitem_Header_1px *) initWithSynckey:(NSString *)_synckey;
@end

我继续在实现文件中实现它:

- (Workflow_Workitem_Header_1px *) initWithSynckey:(NSString *)_synckey {

    [super initWithSynckey:_synckey];
    //..
    //..
    return self;
}

现在,如果我在子类声明中没有声明initWithSynckey :(上面的注释声明),我会在实现中收到警告:“警告:从不同的Objective-C类型初始化”。如果我宣布它,这个警告消失了。好。

继续前进:

我稍后对我的子类进行实例化:

Workflow_Workitem_Header_1px *instance;
instance = [[Workflow_Workitem_Header_1px alloc] initWithSynckey:@"xxxx"];

现在,这给了我同样的警告(不管我是否在我的子类中声明了相应的initWithSynckey:选择器。即,警告:从不同的Objective-C类型初始化“。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

名为init的方法应该具有返回类型(id),而不是类的类型。查看NSString.h和NSArray.h(以及其他类)的示例。这可能是造成问题的原因。

答案 1 :(得分:0)

在这种情况下,重写方法必须返回与超类声明相同的类型。

DOInstance定义了这个:

- (DOInstance *) initWithSynckey:(NSString *)_synckey;

所以Workflow_Workitem_Header_1px必须如下所示:

@interface Workflow_Workitem_Header_1px: DOInstance {
}
- (DOInstance *) initWithSynckey:(NSString *)_synckey;
@end

任何时候你收到警告“警告:从不同的Objective-C类型初始化”你正在做的事情违反你的输入:更改方法签名等。