' – >'(箭头运算符)和'。'之间的区别是什么? (点运算符)在Objective-C?

在Objective-C中,通过使用-> (箭头运算符)和->来访问类中的variables有什么区别. (点运算符)? 是->用来直接访问vs点( . )是不是直接的?

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

所以,例如:

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

访问SomeClass (或其一个超类)中声明的与对象obj相对应的实例variablesname

另一方面, . (通常)用作getter和setter 方法的点语法 例如:

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

相当于使用getter方法name

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

如果name是一个声明的属性 ,那么可以给它的getter方法另外一个名字。

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

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

相当于:

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

箭头->是与指针解引用相结合的一个点的简写,这两个对于某个指针p是相同的:

 p->m (*p).m 

箭头符号是从Cinheritance的,C有它,因为结构成员访问运算符( . )比指针解引用运算符( * )宽松,没有人想要一直写(*p).m ,也不想改变运算符的优先级,使人们写*(pm)来解引用结构体内的指针。 所以,箭头被添加了,所以你可以合理地做p->m*sp而不用括号的丑陋。

当你使用箭头运算符ptr->member它隐式地解引用那个指针。 这相当于(*ptr).member 。 将消息发送到对象指针时,指针也是隐式解除引用的。