objective-c派生类可能不响应基类方法

时间:2010-03-10 01:47:11

标签: objective-c compiler-warnings

我派生自第三方类,当我尝试在基类中调用一个方法时,我得到的x可能无法响应y编译器警告。

如何删除警告?

摄制:

@interface ThirdPartyBaseClass : NSObject {}
+(id)build;
-(void)doStuff;
@end

@implementation ThirdPartyBaseClass
+(id) build{
    return [[[self alloc] init] autorelease];
}
-(void)doStuff{ 
}
@end

@interface MyDerivedClass : ThirdPartyBaseClass {}
+(id)buildMySelf;
@end

@implementation MyDerivedClass
+(id)buildMySelf{
    self = [ThirdPartyBaseClass build];
    [self doStuff]; // compiler warning here - 'MyDerivedClass' may not respond to '+doStuff'
return self;
}
@end

谢谢!

3 个答案:

答案 0 :(得分:4)

在类方法(以'+'开头)中,'self'不是该类的实例; 'self'是Class对象,它只响应Class方法,而不是实例方法。如果您正在构建一个实例,以便可以在其上调用doStuff并将其返回,则需要使用单独的变量:

+ (id) buildMySelf
{
   MyDerivedClass *myDerivedClassInstance;

   myDerivedClassInstance = [self build];
   [myDerivedClassInstance doStuff];

   return myDerivedClassInstance;
}

答案 1 :(得分:1)

-(void)doStuff是一个实例方法,但是你在编译器认为是类的方法上调用它。 编译器认为self可以作为类进行输入,而不是ThirdPartyBaseClass对象

尝试

@implementation MyDerivedClass
+(id)buildMySelf{
    id other = [ThirdPartyBaseClass build];
    [other doStuff];
    return other;
}
@end

答案 2 :(得分:0)

您是否尝试将buildMySelf更改为:

+(id)buildMySelf{
      self = [MyDerivedClass build];
      [self doStuff];
      return self;
}

使用[ThirdPartyBaseClass build];生成ThirdPartyBaseClass的实例,而不是MyDerivedClass