【问题标题】:Objective C Selector not defined in interface but still OK目标 C 选择器未在接口中定义但仍然可以
【发布时间】:2024-04-26 20:30:02
【问题描述】:

第一次发帖。尝试学习目标 C。我有不错的 OOP 知识。我有一点 C、C++ 和 Java 背景,但生疏。不幸的是,我很难理解一些 Objective C 的概念和语法。

我正在 compileonline 中尝试一些代码,经过一些注释后,我的代码可以正常工作,但我注意到我的方法声明仍然被注释掉了。请参阅 initWithName

#import <Foundation/Foundation.h>

@interface cl_person: NSObject
{
    NSString* name;
    int age;
}

//-(id)init;
//-(id)initWithName: (NSString*)p_name withAge: (int)p_age;
-(void)display;

@end

@implementation cl_person
/*
-(id)init{

  return self;
}*/

-(id)initWithName: (NSString*)p_name{

  //self = [self init];
  name = p_name;
  return self;
}


-(id)initWithName: (NSString*)p_name withAge: (int)p_age{

  self = [self initWithName: p_name];
  age = p_age;
  return self;  
}

-(void)display{

  printf("My name is %s and I am %d years old.", [name UTF8String], age);
}

@end

int main (int argc, const char * argv[])
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

  cl_person *o_person = [[cl_person alloc] initWithName: @"Dick" withAge: 25];   
  [o_person display];
  [o_person release];

  //NSLog (@"hello world");
  [pool drain];
  return 0;
}
  1. 我假设 (id)initWithName 是 NSObject 的一个方法,所以直接实现它意味着覆盖超类的方法。我说的对吗?
  2. 根据苹果开发文档,选择器是方法签名的一部分——更不用说输入类型和它们的顺序,但这个例子中的一些事情让我感到困惑。为什么即使没有声明,我也允许使用选择器 withAge 实现方法?

如果这已经在其他地方介绍过,我们深表歉意。我进行了快速搜索并浏览了一些可能相关的点击,但没有任何帮助。谢谢!

[NSTotalNoob 发布];

【问题讨论】:

    标签: objective-c methods selector


    【解决方案1】:
    1. 不,该方法特定于此类。

    2. 我不确定您所说的“使用选择器 withAge 实现方法”是什么意思。该方法的名称是 initWithName:withAge:。所有这些都是一个名字的一部分。在 Objective-C 中没有要求声明你的方法。如果您希望从类外部看到它们,您应该在 .h 文件中声明它们。我见过一些人说你仍然可以从类外调用它们,但是你会得到编译器警告——但是,在 Xcode 中使用默认设置的 ARC 下,你不能这样做,你会得到一个错误,而不仅仅是来自编译器的警告。

    既然你是个菜鸟,根据你自己的说法,我应该提一些其他的事情。通常,在 OS X 和 iOS 中,除了模板在 main.m 文件中提供的内容之外,我们不会放置任何代码。类名应以大写字母开头,方法、ivars 和属性应以小写字母开头。我们还使用驼峰式命名而不是下划线,因此您的类最好写为 ClPerson,实例写为 oPerson。

    【讨论】:

    • 感谢您的回复。只是跟进.. “Objective-C 中没有要求声明您的方法。如果您希望从类外部看到它们,您应该在 .h 文件中声明它们。” 2.1 这是否意味着我在实现中创建的任何未在接口中声明的方法本质上都是私有方法? 2.2 另外,调用main()中的方法不会被归类为类外吗?它是怎么起作用的?另外,感谢有关约定的快速教程。
    • @NSTotalNoob 2.1 是的,从某种意义上说——Objective-C 中没有真正的私有方法,但不声明它们,确实隐藏了它们。我认为您始终可以使用 performSelector 调用方法:无论它是否已声明。 2.2 我不知道那个问题的答案。也许您没有使用ARC?你有没有收到任何编译器警告?
    • 不,我不这么认为。只需阅读有关 arc - 不再保留/释放 :)。我想我有 sdk (2010) 的旧副本。我会尽快获得新 sdk 的副本。我使用的是在线编译器,虽然 compileonline.com .. 也许这就是问题所在:) 感谢先生的帮助!真的很感激。