2

我试图学习 obj-c,这是我不明白的东西。我知道一些 c#,所以有人可以尝试用 ac#y-way 来解释这一点,我也许可以更好地理解它:)

#import <Foundation/Foundation.h> @interface Car : NSObject
@interface Car : NSObject
  {
  int year;
  NSString *make;
  NSString *model;
  }

  **- (void) setMake:(NSString *) aMake andModel:(NSString *) aModel andYear: (int) aYear;**
  - (void) printCarInfo;
  - (int) year;
@end

我想我理解变量的声明,但我没有得到它的方法(s?)。有人可以解释这是做什么的(粗体代码)吗?

4

2 回答 2

2

您学习中缺少的概念是“选择器”。它本质上就像“装饰”一个方法签名,其语义比带括号的参数传递所能获得的语义更多。我们倾向于为我们的方法原型使用描述性的、类似句子的“选择器”。例如,考虑这个基本函数:

void function setDimensions(int width, int height);

在 Objective-C 中,我们会这样写:

- (void) setWidth:(int) newWidth height:(int) newHeight;

并且“选择器”(这是 Objective-C 中的一流概念)是setWith:height:(包括冒号,但没有其他任何内容)。这就是在该类上唯一标识该方法的东西。

调用该方法发生在运行时,当您向该对象发送一条消息,并将参数放在选择器中的冒号之后。因此,消息具有三个基本组成部分:接收者、选择器和放置良好的参数:

[anObject setWidth: 1024 height: 768];

这里,anObject是接收者,setWidth:height:是选择器(帮助运行时找到方法),参数是:newWidth = 1024; newHeight = 768;.

然后在方法的实现中,只需像您期望的那样使用 newWidth 和 newHeight :

- (void) setWidth:(int) newWidth height:(int) newHeight; {
    self.width = newWidth; // 1024
    self.height = newHeight; // 768
}

起初它可能看起来很尴尬和多余,但当你习惯它之后,你会更喜欢它,并发现自己用其他语言编写更长、更语义化的函数名称。

与选择器相关的概念在与一些Objective-C 运行时的基础知识一起学习时会更好地理解,特别是“发送消息”(而不是“调用方法”)的概念以及在运行时,而不是编译的事实。根据您在消息中使用的选择器查找实际方法的时间。这发生在运行时的事实为高度动态的架构提供了显着的灵活性。

于 2012-08-27T22:48:08.977 回答
0

在 Objective-C 方法中有命名参数。方法声明语法如下:

- (returnValue)nameOfArgument1:(typeOfArgument1)nameOfVariable1 
               nameOfArgument2:(typeOfArgument2)nameOfVariable2 
               nameOfArgument3:(typeOfArgument3)nameOfVariable3;

换行符当然是可选的,但您需要用至少一个空格分隔参数。第一行的 - 符号表示这是一个实例方法(与类方法相反,它应该以 + 符号开头)。

.m 文件中的实现看起来完全相同,只是将分号替换为实现:

- (returnValue)nameOfArgument1:(typeOfArgument1)nameOfVariable1 
               nameOfArgument2:(typeOfArgument2)nameOfVariable2 
               nameOfArgument3:(typeOfArgument3)nameOfVariable3 {
    // Implementation
    // Return something of type "returnValue".
}

你会像这样从其他地方调用这个方法:

[myObject nameOfArgument1:variableToPass1 
          nameOfArgument2:variableToPass2
          nameOfArgument3:variableToPass3];

我希望这能让事情更清楚一些。

于 2012-08-27T22:37:06.353 回答