' - >'(箭头操作符)和'.'之间有什么区别?Objective-C中的(点运算符)?

Tae*_*Kim 19 objective-c

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

小智 21

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

所以,例如:

SomeClass *obj = …;
NSLog(@"name = %@", obj->name);
obj->name = @"Jim";
Run Code Online (Sandbox Code Playgroud)

访问在对象中对应的(或其超类之一)中name声明的实例变量.SomeClassobj

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

SomeClass *obj = …;
NSLog(@"name = %@", obj.name);
Run Code Online (Sandbox Code Playgroud)

相当于使用getter方法name:

SomeClass *obj = …;
NSLog(@"name = %@", [obj name]);
Run Code Online (Sandbox Code Playgroud)

如果name声明的属性,则可以为其getter方法指定另一个名称.

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

SomeClass *obj = …;
obj.name = @"Jim";
Run Code Online (Sandbox Code Playgroud)

相当于:

SomeClass *obj = …;
[obj setName:@"Jim"];
Run Code Online (Sandbox Code Playgroud)

  • 如果将实例变量命名为与属性不同(例如`@synthesize name = ivar_name`),则区别更明显.然后,您只能使用`someObject-> ivar_name`访问实例变量,并且只能使用`someObject.name`访问属性getter. (6认同)

mu *_*ort 10

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

p->m
(*p).m
Run Code Online (Sandbox Code Playgroud)

箭头符号继承自C和C有它,因为访问operator(.)的结构成员比指针解引用operator(*)更宽松,没有人想要一直写(*p).m,也不想改变运算符优先级以使人们写*(p.m)取消引用结构内的指针.因此,添加箭头,这样你可以两者都做p->m,并*s.p没有括号的丑陋理智.