2011-07-09 50 views

回答

9

箭头,->,为点与指针引用组合的简写,这两个是一些指针p相同:

p->m 
(*p).m 

箭头符号选自C继承和C具有它,因为结构成员访问操作符(.)的绑定比指针解引用操作符(*)宽松,并且没有人希望始终写(*p).m,也不希望更改操作符优先级,以使人们编写*(p.m)以取消引用结构中的指针。所以,箭头被添加了,这样你就可以明智地做到p->m*s.p,而没有括号的丑陋。

0

当您使用箭头运算符ptr->member时,它隐式地解引用该指针。这相当于(*ptr).member。将消息发送给对象指针时,指针也会隐式解除引用。

18

->是传统的C运算符来访问由指针引用的结构的成员。由于Objective-C对象(通常)用作指针,并且Objective-C类是一个结构,因此您可以使用->来访问其成员,该成员通常对应于实例变量。请注意,如果您尝试从类外部访问实例变量,则实例变量必须标记为公共。

所以,例如:

SomeClass *obj = …; 
NSLog(@"name = %@", obj->name); 
obj->name = @"Jim"; 

访问实例变量name,在SomeClass(或其超之一)声明,对应于对象obj

另一方面,.(通常)用作dot syntax用于吸气器和设定器方法。例如:

SomeClass *obj = …; 
NSLog(@"name = %@", obj.name); 

等同于使用getter方法name

SomeClass *obj = …; 
NSLog(@"name = %@", [obj name]); 

如果namedeclared property,有可能给它的getter方法的另一个名字。

点语法也用于setter方法。例如:

SomeClass *obj = …; 
obj.name = @"Jim"; 

相当于:

SomeClass *obj = …; 
[obj setName:@"Jim"]; 
+6

如果您将实例变量命名为与属性不同的名称(例如'@synthesize name = ivar_name'),则区别更加明显。然后你只能用'someObject-> ivar_name'访问实例变量,你只能通过'someObject.name'访问属性getter。 – Chuck

+0

@Bavarious我现在觉得这个答案令人困惑,为什么会有这么多关于“名称”的讨论?是否名称是实例类型的getter/setter方法。 obj,一个指针,必须在你可以访问名字之前进行推理,无论名字是什么,都可以吗?你的答案不应该只是obj-> name与(* obj).name相同吗?或者你的回答部分地说,Objective C getters/setters不必遵守obj的指针,并且可以简单地使用点符号?也许如果省略SomeClass * obj = ...的每个声明都不使用省略号;我会更好地理解...... :) –

+0

@Chuck“Objective-C类是一个结构”是什么意思?这对于一个班级来说是什么意思?它们本质上不同吗?类是引用类型,结构是值类型? (对不起,我抓住你,但Bavarious不再使用他的帐户) – Honey

相关问题