[英]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.