2013-02-19 107 views
-1

我對Objective-C非常陌生,當我練習書本練習時,我真的被困在這裏,請幫我解決這個問題。我一直在想,是什麼引發這個錯誤了三個多小時。我仍然沒有得到它!Objective-C錯誤「XYZPerson沒有可見的@interface」聲明選擇器'saySomething'

最好的問候, 拉吉。

提前感謝!

的main.m

#import <Foundation/Foundation.h> 
#import "XYZPerson.h" 
#import "XYZShout.h" 
int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     //XYZPerson *some = [[XYZPerson alloc]init]; 

     XYZShout *some = [[XYZShout alloc]init]; 
     [some sayHello]; 



     // insert code here... 
     // NSLog(@"Hello, World!"); 

    } 
    return 0; 
} 

XYZPerson.h

#import <Foundation/Foundation.h> 
@interface XYZPerson : NSObject 

@property NSString *firstName; 
@property NSString *secondName; 
@property NSDate *dob; 

-(void) saySomething; 
-(void) sayHello; 

@end 

XYZPerson.m

#import "XYZPerson.h" 
@implementation XYZPerson 

-(void) sayHello { 
    [self saySomething:@"Hello all"]; 
} 

-(void) saySomething:(NSString *)greet { 
    NSLog(@"%@", greet); 
} 

@end 

XYZShout.h

#import "XYZPerson.h" 

@interface XYZShout : XYZPerson 

// -(void) saySomething; 

@end 

XYZShout.m

#import "XYZShout.h" 

@implementation XYZShout 

-(void) saySomething:(NSString *)greet { 
    NSString *upperGreet = [greet uppercaseString]; 
    [super saySomething:upperGreet]; // this is where I get the error mentioned above 
} 

@end 

得到它的工作!感謝@MatthewD,@trojanfoe,@ JFS對你的大力幫助:)

+1

您是否也可以包含XYZShout.h的代碼? – MatthewD 2013-02-19 11:27:04

+0

如果將XYZPerson.h中的' - (void)saySomething'改爲' - (void)saySomething:greet;'? – MatthewD 2013-02-19 11:29:39

+0

添加XYZShout.h馬修 – Raj0689 2013-02-19 11:38:34

回答

3

(從評論搬進一個答案......)

MatthewD:如果將- (void) saySomething;改爲XYZPerson.h改爲- (void) saySomething:greet;會發生什麼情況?

Raj0689:爲什麼它運行時,我將其更改爲saySomething:greet而不是saySomething?由於問候只與saySomething一起定義!

當您調用一個方法時,編譯器需要找到該方法的簽名,以便它可以驗證該方法是否正確調用。簽名包括方法名稱和參數的數量和類型。提供方法簽名的常用方法是導入定義這些簽名的頭文件。

因此,在XYZShout.m在那裏你撥打:

[super saySomething:upperGreet];

編譯器搜索XYZShout.h,這是由XYZShout.m進口的,XYZPerson.h,這是由XYZShout.h進口。在XYZShout.h,正在發現下面的方法:

-(void) saySomething;

這所調用的方法相匹配的名字,但沒有參數,所以編譯器不認爲這是一個比賽。 saySomething沒有其他定義可以在任何地方找到,所以它給出了一個錯誤。

3

請確保將XYZShout.h接口設置爲@interface XYZShout : XYZPerson

+0

亞......我已經設定了 – Raj0689 2013-02-19 11:39:08

+0

@JFS不要問一個問題作爲答案。 – Popeye 2013-02-19 11:46:10

+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你可以隨時評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/faq#reputation),你將能夠[評論任何帖子](http://stackoverflow.com/privileges/comment)。 – mipe34 2013-02-19 11:49:38

6

它看起來像你正在測試繼承,所以我會假設XYZShout應該從XYZPerson派生。如果是遵循@JFS的建議,並確保它實際上做得出:

XYZShout.h:

#import <Foundation/Foundation.h> 
#import "XYZPerson.h" 

@interface XYZShout : XYZPerson 

- (void)saySomething:(NSString *)greet; 

@end 

而且也是正確的XYZPersonsaySomething定義(你錯過斷參數):

XYZPerson.h:

#import <Foundation/Foundation.h> 
@interface XYZPerson : NSObject 

@property NSString *firstName; 
@property NSString *secondName; 
@property NSDate *dob; 

- (void)saySomething:(NSString *)greet; 
//     ^^^^^^^^^^^^^^^^^ 
- (void)sayHello; 

@end 
+0

非常感謝:)它真的幫助:) – Raj0689 2013-02-19 11:48:17

相關問題