【问题标题】:Undeclared method in Objective-CObjective-C 中未声明的方法
【发布时间】:2012-06-16 20:55:57
【问题描述】:
#import "PsychologistViewController.h"
#import "HappinessViewController.h"

@interface PsychologistViewController()
@property (nonatomic) int diagnosis;
@end

@implementation PsychologistViewController

@synthesize diagnosis = _diagnosis;

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{
       if ([segue.identifier isEqualToString:@"ShowDiagnosis"]) {
        [segue.destinationViewController setHappiness:self.diagnosis];
       } 
       else if ([segue.identifier isEqualToString:@"Celebrity"]) {
        [segue.destinationViewController setHappiness:100];
       } 
       else if ([segue.identifier isEqualToString:@"Serious"]) {
        [segue.destinationViewController setHappiness:20];
       } 
       else if ([segue.identifier isEqualToString:@"TV Kook"]) {
        [segue.destinationViewController setHappiness:50];
       }
}

****- (void)setAndShowDiagnosis:(int)diagnosis****
{
    self.diagnosis = diagnosis;
    [self performSegueWithIdentifier:@"ShowDiagnosis" sender:self];
}

-(IBAction)flying
{
    [self setAndShowDiagnosis:85];
}

-(IBAction)apple 
{    
[self setAndShowDiagnosis:100];
}

-(IBAction)dragons
{
    [self setAndShowDiagnosis:20];
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

@end

我的问题与- (void)setAndShowDiagnosis:(int)diagnosis 方法有关。此方法在任何 .h 文件中的任何地方都未声明为公共的,显然它也不是私有的。我的问题是为什么会这样?它只显示了它的 setter 实现,但实际的方法声明却没有出现。任何澄清这一点的帮助表示赞赏。哦,这是来自在线讲座,所有内容都可以正常编译并运行。

【问题讨论】:

    标签: objective-c methods private setter public


    【解决方案1】:

    方法不需要公开、私下或以其他方式声明。在 .h 文件中声明方法可以让其他用户了解这些方法的类知识。通过不声明它,您将该方法从使用该类的程序的其余部分隐藏起来。

    【讨论】:

    • +1。接口声明的重点在于它定义了类的接口。您在 C++ 或 Java 中称为“私有方法”的东西不是接口的一部分,因此没有理由它们必须成为接口声明的一部分。 (在 C++ 中,它们必须存在,以便编译器可以静态解析函数调用并构建 vtable;在 Java 中,它们必须存在,因为没有单独的声明和定义;在 ObjC 中,这些都不适用。)
    【解决方案2】:

    此方法在任何地方都未声明为任何 .h 文件中的 public 和 显然也不是私下的。

    我想你回答了你自己的问题,它是未声明的,因为它没有被声明。除非我读错了?

    【讨论】:

      【解决方案3】:

      如果您希望方法是私有的,则不必声明它们。在objective-c中没有私有方法之类的东西。

      在头文件中声明方法和在实现文件顶部的类扩展之间的区别在于,如果您不在头文件中声明它,而您使用另一个类的方法,那么编译器将警告您该方法可能不存在。但是只要你实现了该方法,应用程序就不会崩溃,并且会调用该方法。

      您可以在任何地方不声明任何方法而侥幸逃脱,但您会收到大量编译器警告,并且以后更难阅读,其他人也更难理解您的代码。并且由于您错过拼写方法名称或其他一些小错误而导致崩溃的可能性更大。

      【讨论】:

      • “objective-c 中没有 private 这样的东西”是不正确的。非常肯定有这样的事情,它只是不适用于方法声明。
      • Private 确实不适用于 obj-c 方法,但您仍然可以尝试调用对象上的方法,即使它没有预先声明,就像 Jonathan 说的那样,您只需获得编译器警告。
      • 对不起,你是对的。我只是错过了“方法”这个词
      猜你喜欢
      • 2015-04-20
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      相关资源
      最近更新 更多