2013-02-19 109 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

相关问题