2010-03-10 109 views
1

我從第三方類派生的迴應,當我嘗試調用基類的方法,我得到的x可以不爲y編譯器警告做出迴應。Objective-C的派生類可能不是基類的方法

我怎樣才能刪除警告?

攝製:

@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 

謝謝!

回答

4

在一類方法(由「+」開頭),「自我」不是班級實例; 'self'是Class對象,它只響應Class方法,而不響應實例方法。如果你正在構建一個實例,所以你可以調用它doStuff,並返回它,你需要使用一個獨立的變量:

+ (id) buildMySelf 
{ 
    MyDerivedClass *myDerivedClassInstance; 

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

    return myDerivedClassInstance; 
} 
0

你有沒有試圖改變buildMySelf到:

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

使用[ThirdPartyBaseClass build];產生的ThirdPartyBaseClass,不MyDerivedClass一個實例。

+0

這仍然產生了「可以不迴應...」警告 – zadam 2010-03-11 19:28:23

1

-(void)doStuff是一個實例方法,但是你叫它什麼編譯器認爲是類。 編譯器認爲自要被分類爲作爲一類,而不是作爲一個ThirdPartyBaseClass對象

嘗試

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