2014-04-14 60 views
0

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

// 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,为什么我只能用方括号呢?

+1

使用'object.number = 4' –

+1

带点表示法的等效语句是object.number = 4,而不是object.setNumber = 4.点表示法使用属性本身的名称,而不是使用setter的名称。 – rdelmar

+2

只要您有一个采用0或1个参数的方法,就可以使用点表示法。你的代码的问题是(为什么你会得到警告),你必须*不*在点表示法中使用'set'。这是为什么?编译器从点符号生成常规方法调用。所以如果你写'object.number = 4;'编译器生成'[object setNumber:4];'。这就是为什么当你编写'object.setNumber = 4;'时它不起作用,因为编译器生成了'[object setSetNumber:4];'而且这个方法不存在。 – HAS

回答

0

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

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

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

- (int) getNumber { 
    return _number; 
} 

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

-1

你很混淆的方法和属性。

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

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

你想要做的是使用属性名称,而不是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. 您可以读取和写入的属性通过点符号使用时object.number = 3;
+1

您的“可变”术语已关闭。 '[object number]'是一个像'[object doThatThingYouDo]'一样发送的消息'。这不是“读变数”;一种方法正在运行;它的返回值可能是一个实例变量的值,但这不是固有的。 'object.number'也不能直接访问变量。它又是一个语法糖,用于发送方法调用。 “调用方法的唯一方法是用括号表示法,因此IE'[object setNumber:3];'”因此不正确。 –

+0

答案错了,请参阅我上面的评论。 – HAS

+0

对不起,没有正确的术语。我更新了我的答案,以包含正确的术语。 –