0

第一篇文章。尝试学习目标 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 发布];

4

1 回答 1

0
  1. 不,该方法特定于此类。

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

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

于 2013-05-08T06:02:55.643 回答