【问题标题】:Error: No visible @interface for 'XYZPerson' declares the selector 'saySomething' [duplicate]错误:“XYZPerson”没有可见的@interface 声明选择器“saySomething”[重复]
【发布时间】:2013-05-14 19:49:39
【问题描述】:

搜索了几个线程,但没有找到答案。

我是 Objective-C 的新手,在 Apple 开发中浏览了简报并进行了实验,并不断收到错误消息:“XYZPerson”没有可见的@interface 声明选择器“saySomething”

控制台程序添加了一个名为的类 XYZ人。以下是 .h 和 .m 文件:

这是 XYZPerson.h 文件:

#import <Foundation/Foundation.h>

@interface XYZPerson : NSObject

@property (readonly) NSString *firstName;
@property (readonly) NSString *lastName;
@property (readonly) NSDate *dateOfBirth;

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

+ (id)person;

@end

这是 XYZPerson.m 文件:

#import "XYZPerson.h"

@implementation XYZPerson

- (void)sayHello
{
    [self saySomething:@"Say Hello, World!"];
}

- (void)sayBooBoo
{
    [self saySomething:@"Say BooBoo, World!"];
}


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

这是 main() 中的代码:

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

int main(int argc, const char * argv[])
{

    @autoreleasepool {

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

        XYZPerson *aPerson = [[XYZPerson alloc] init];

        [aPerson sayHello];
        [aPerson sayBooBoo];

        [aPerson saySomething:@"Something"];

    }
    return 0;
}

这会导致构建失败。如果我删除 main() " [aPerson saySomething:@"Something"];" 中的行

然后程序将运行并输出以下输出:

013-05-14 15:38:04.102 XYZPerson[2303:303] Hello, World from Main!

2013-05-14 15:38:04.105 XYZPerson[2303:303] Say Hello, World!

2013-05-14 15:38:04.106 XYZPerson[2303:303] Say BooBoo, World!

只是不明白为什么我可以在 main() 中调用 [aPerson sayHello] 和 [aPerson sayBooBoo] 但 [aPerson saySomething:@"Something."] 会导致问题。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    正如 cmets 中所指出的,已经回答了这个完全相同的问题,但为了给您一个快速的答案,您的 .h 具有方法 - (void)saySomething; 而您的 .m 请求输入参数(NSString)所以您需要将 .h 中的 saySomething 更改为:

    - (void)saySomething:(NSString *)greeting
    

    您在 .m 中使用的签名完全相同。

    由于您在 StackOverFlow 上的活动有限,我只想建议您在发布问题之前进行一些研究。我相信您做到了,但如果您在此处发布问题之前进行彻底的搜索,这肯定对每个人都有好处。

    【讨论】:

    • 天啊!谢谢!我想我被甩了是因为“sayHello”和“sayBooBoo”对“saySomething”的调用运行良好。不知道为什么会这样。也许是因为“saySomething”完全在实现本身中定义。可能是外部实体“main()”引发错误的原因是它“saySomething”未在 XPZPerson 头文件中完全定义。
    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    相关资源
    最近更新 更多