Objective C Selector未在界面中定义但仍然可以

时间:2013-05-08 05:17:06

标签: objective-c methods selector

第一篇文章。试图学习目标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. 根据apple dev docs,选择器是Method签名的一部分 - 更不用说输入类型及其顺序,但这个例子中的一些东西让我感到困惑。为什么我允许使用选择器withAge实现一个方法,即使这没有被声明?
  3. 道歉,如果其他地方已经涵盖了这一点。我做了一个快速搜索,浏览了一些可能相关的点击但没有帮助。谢谢!

    [NSTotalNoob发布];

1 个答案:

答案 0 :(得分:0)

  1. 不,该方法特定于此课程。

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

  3. 由于你是一个完全的菜鸟,通过你自己的帐户,我应该提一些其他的东西。通常,在OS X和iOS中,除了模板在main.m文件中提供的代码之外,我们不会添加任何代码。类名应以大写字母开头,方法,ivars和属性应以小写字母开头。我们还使用camel case来命名而不是下划线,所以你的类最好用ClPerson编写,实例用oPerson编写。