我派生自第三方类,当我尝试在基类中调用一个方法时,我得到的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
谢谢!
答案 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
。