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

我目前正在学习自己的objective-c和iOS编程,并发现自己由于这个微妙的错误一小时卡住非工作代码。 考虑下面的代码:

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

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

一旦我看到错误,我试图找出调用这个方法的方法,但是在我的几次尝试中都没有成功。

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

  • -这是一个实例方法(与带有+的类方法相比)。
  • (NSString *)它返回一个string。
  • :如果你要说出这个方法的名字,那简直就叫做“冒号”。 :告诉编译器你的方法也接受一个参数。
  • name有一个名为参数。

当你不指定一个types时,编译器假设你是指id ,所以这个方法实际上是充实的- (NSString *):(id)hello

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

你可以做很奇怪的事情,因为:是一个方法的有效名称,编译器假定id 。 你可以,如果你真的想要,有一个方法叫- ::: 。 编译器会假定你的意思是- (id):(id):(id):(id) ,这个方法返回一个idtypes的对象,并接受三个idtypes的参数。 你会这样调用它: [self :@"hello" :anObject :myObject];

一个方法声明像你发布的是罕见的(和风格差,imo)。 Objective-C应该是冗长的。 方法如下所示:

  1. 第一个字符:或者-或者+-表示它是一个实例方法, +表示它是一个类方法。
  2. 括号中的值:方法的返回types。 在你的例子中,该方法返回一个(NSString *)
  3. 其余(大括号之前)是方法名称以及它们所带的参数。 你可以有一个没有参数的名字,在这种情况下,方法名不会有: in。 如- (void) reload; 这将是一个方法,不会返回一个值,不带参数。
  4. 如果你的方法需要参数,它们将被混合到方法名称中,通常会声明types(不像你的例子)。 如- (NSString *) reverseString:(NSString *) stringToReverse; 在这个例子中,你的方法名是reverseString:它需要一个参数,一个NSString* ,在方法定义中被称为stringToReverse
  5. 通常情况下,如果你看到一个:没有types的情况下会像- (float) addThreeValues:::这个方法返回一个浮点数,并带有3个参数。 这将是一个合适的定义,因为三个值并不重要,因为我们只是添加它们。