空方法名称,这实际上做了什么?

时间:2012-04-27 22:38:27

标签: objective-c ios

我目前正在学习自己的Objective-c和iOS编程,并且由于这个微妙的错误持续了一个小时,我发现自己陷入了非工作代码。 请考虑以下代码:

@property (strong, nonatomic) NSString *name;
- (NSString *):name { return @"Some name"; }

乍一看(对于任何新人),这看起来像是name属性的重写getter。但是有一个非常微妙的,不应该存在。这里没有来自编译器/解析器/运行时的警告/错误,所以我的问题是这实际上最终是什么?

一旦看到错误,我试图找到一种调用此方法的方法,但在我的几次尝试中没有成功。

2 个答案:

答案 0 :(得分:13)

方法签名- (NSString *):name分解为以下内容:

  • -这是一个实例方法(与具有+的类方法相比)。
  • (NSString *)返回一个字符串。
  • :如果您要说出此方法的名称,它将简称为“冒号”。 :告诉编译器您的方法也接受一个参数。
  • name有一个名为name的参数。

当你没有指定一个类型时,编译器假定你的意思是id,所以这个方法实际上充实为- (NSString *):(id)hello

对此方法的有效调用是:[self :@"hello"]

你可以做一些非常奇怪的事情,因为:是方法的有效名称,编译器假设id。如果您真的想,可以使用名为- :::的方法。编译器会假设您的意思是- (id):(id):(id):(id),该方法返回类型为id的对象,并采用类型为id的三个参数。您可以这样称呼它:[self :@"hello" :anObject :myObject];

答案 1 :(得分:3)

一个方法声明就像你发布的方法很少(而且风格很差,imo)。 Objective-C应该是冗长的。方法分解如下:

  1. 第一个字符:-+-表示它是一个实例方法,+表示它是一个类方法。
  2. 括号中的值:方法的返回类型。在您的示例中,该方法返回(NSString *)
  3. 其余的(花括号之前)是方法名称及其采用的任何参数。您可以使用不带参数的名称,在这种情况下,方法名称中不会包含:。例如- (void) reload;这将是一个不返回值且不带参数的方法。
  4. 如果您的方法接受参数,它们将被混合到方法名称中,并且通常会声明类型(与您的示例不同)。例如- (NSString *) reverseString:(NSString *) stringToReverse;在此示例中,您的方法名称为reverseString:,它需要一个参数,NSString*将在方法定义中称为stringToReverse
  5. 通常情况下,如果您看到:没有类型,则会出现类似- (float) addThreeValues:::的情况。此方法返回一个浮点并获取3个参数。这将是一个合适的定义,因为这三个值并不重要,因为我们只是添加它们。