使用点表示法设置属性时出错“找不到属性setVariableName”

时间:2014-04-14 04:04:09

标签: objective-c syntax accessor declared-property

我刚开始学习Objective-C,我不确定何时使用点符号与方括号。我知道有一个类似的问题被问到here,但我仍然没有真正理解其中的差异。我读过[myObject doSomething]myObject.doSomething是等价的。我不确定的是,当我使用@property生成方法时,它会自动生成一个我只能用方括号使用的setter方法。

// MyClass.h

@interface MyClass : NSObject
@property int number; 


// main.m
MyClass *object = [[MyClass alloc] init];
[object setNumber:3];
object.setNumber = 4; // Property 'setNumber' not found

为什么我在编写object.setNumber = 4时收到错误消息,为什么我只能使用方括号?

2 个答案:

答案 0 :(得分:0)

您收到该错误,因为该属性名为number而不是setNumber。在OOP语言中,通常使用“setter”和“getter”来创建访问对象数据的方法。 Objective-C 2.0中的属性合成了这个过程并自动生成了setter和getter。如果你进入MyClass.m并输入- setN,你会看到Xcode建议的setNumber。这是因为您可以自己实现自己的setter和getter来自定义它们的行为,或者保留简单设置值或获取值的默认行为。

此外,属性会自动生成变量声明_variableName例如,您的属性的默认行为是:

- (void) setNumber:(int)number {
    _number = number
}

- (int) getNumber {
    return _number;
}

确定是否应该使用其中一个真正归结为一致性。为确保团队的一致性,应制定样式指南。以NY Times为例。它们将点符号严格限制为非属性方法的属性和括号(即setter和getter)。

答案 1 :(得分:-1)

你的方法和属性令人困惑。

创建属性时,是的,它会创建一个名为setVARIABLE的setter方法。

调用方法的唯一方法是使用括号表示法。 IE [object setNumber:3];(除非你有0或1个参数,谢谢你)

您要做的是使用属性名称,而不是setter(或getter)方法。

[object number];

这将返回数字的值。通过括号表示法访问属性时无法读取属性,它只是只读(只能访问get函数)。

object.number = 3;

这就是你用点符号设置属性编号的方法。

当您编写object.setNumber = 3;时,您将setNumber视为属性,但它不是,它是一种方法。

回顾一下

  1. 方法只能通过括号表示法使用,而不能用点符号[object setNumber:3];(除非你有0或1个参数)
  2. 只有在通过括号表示法[object number]; //returns the value of number
  3. 访问属性时才能读取属性
  4. 通过点符号object.number = 3;
  5. 使用时,您可以读取和写入属性