1

我对 Objective-C 真的很陌生,当我练习书本练习时,我真的被困在这里。请帮我解决这个问题,我一直在思考可能导致此错误的原因超过三个小时。还是我没看懂!

最好的问候,拉吉。

提前致谢 !

主文件

#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 的大力帮助 :)

4

3 回答 3

6

看起来您正在测试继承,所以我假设它XYZShout应该是从XYZPerson. 如果是这样,请遵循@JFS 的建议并确保它确实派生:

XYZShout.h:

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

@interface XYZShout : XYZPerson

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

@end

并更正saySomethingin的定义XYZPerson(您错过了参数):

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
于 2013-02-19T11:37:35.527 回答
4

(从评论移到答案...)

MatthewD:如果你换成 会 发生- (void) saySomething;什么?XYZPerson.h- (void) saySomething:greet;

Raj0689:为什么当我将其更改为saySomething:greetand not时它会运行saySomething?由于 greet 仅与saySomething!!

当您调用一个方法时,编译器需要找到该方法的签名,以便它可以验证该方法是否被正确调用。签名包括方法名称以及参数的数量和类型。提供方法签名的常用方法是导入定义这些签名的头文件。

所以,在XYZShout.m你打电话的地方:

[super saySomething:upperGreet];

编译器搜索XYZShout.h由 导入的XYZShout.mXYZPerson.h由 导入的XYZShout.h。在XYZShout.h中,找到了以下方法:

-(void) saySomething;

这在名称中匹配被调用的方法,但在参数中不匹配,因此编译器不认为这是匹配。在任何地方都找不到的其他定义saySomething,因此它会给出错误。

于 2013-02-19T21:46:06.570 回答
3

请确保将XYZShout.h接口设置为@interface XYZShout : XYZPerson

于 2013-02-19T11:31:03.663 回答