繁体   English   中英

'->'(箭头运算符)和'.'有什么区别? (点运算符)在 Objective-C 中?

[英]What is the difference between '->' (arrow operator) and '.' (dot operator) in Objective-C?

在 Objective-C 中,使用-> (箭头运算符)和访问 class 中的变量有什么区别. (点运算符)? ->用于直接访问 vs 点( . )不是直接的吗?

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

因此,例如:

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

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

另一方面, . (通常)用作 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

箭头符号是从 C 和 C 继承的,因为结构成员访问运算符 ( . ) 绑定比指针解引用运算符 ( * ) 更松散,没有人想一直写(*p).m也不想写更改运算符优先级以使人们编写*(pm)以取消引用结构内的指针。 因此,添加了箭头,这样您就可以明智地执行p->m*sp而不会出现括号的丑陋。

当您使用箭头运算符ptr->member时,它会隐式取消引用该指针。 它相当于(*ptr).member 当您向 object 指针发送消息时,该指针也被隐式取消引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM