In Objective-C使用->
(箭头运算符)和.
(点运算符)访问类中的变量有什么区别?用->
直接访问vs点(.
)是不是直接?' - >'(箭头运算符)和'。'之间的区别是什么? (点运算符)在Objective-C?
回答
箭头,->
,为点与指针引用组合的简写,这两个是一些指针p
相同:
p->m
(*p).m
箭头符号选自C继承和C具有它,因为结构成员访问操作符(.
)的绑定比指针解引用操作符(*
)宽松,并且没有人希望始终写(*p).m
,也不希望更改操作符优先级,以使人们编写*(p.m)
以取消引用结构中的指针。所以,箭头被添加了,这样你就可以明智地做到p->m
和*s.p
,而没有括号的丑陋。
当您使用箭头运算符ptr->member
时,它隐式地解引用该指针。这相当于(*ptr).member
。将消息发送给对象指针时,指针也会隐式解除引用。
->
是传统的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]);
如果name
是declared property,有可能给它的getter方法的另一个名字。
点语法也用于setter方法。例如:
SomeClass *obj = …;
obj.name = @"Jim";
相当于:
SomeClass *obj = …;
[obj setName:@"Jim"];
如果您将实例变量命名为与属性不同的名称(例如'@synthesize name = ivar_name'),则区别更加明显。然后你只能用'someObject-> ivar_name'访问实例变量,你只能通过'someObject.name'访问属性getter。 – Chuck
@Bavarious我现在觉得这个答案令人困惑,为什么会有这么多关于“名称”的讨论?是否名称是实例类型的getter/setter方法。 obj,一个指针,必须在你可以访问名字之前进行推理,无论名字是什么,都可以吗?你的答案不应该只是obj-> name与(* obj).name相同吗?或者你的回答部分地说,Objective C getters/setters不必遵守obj的指针,并且可以简单地使用点符号?也许如果省略SomeClass * obj = ...的每个声明都不使用省略号;我会更好地理解...... :) –
@Chuck“Objective-C类是一个结构”是什么意思?这对于一个班级来说是什么意思?它们本质上不同吗?类是引用类型,结构是值类型? (对不起,我抓住你,但Bavarious不再使用他的帐户) – Honey
- 1. 算术运算符^和。^之间的区别是什么?
- 2. 运算符>>和运算符>>>在java中有什么区别?
- 3. 在Java中,箭头运算符' - >'是做什么的?
- 4. SQL中的IN运算符和=运算符有什么区别?
- 5. 点(。)运算符和 - >在C++中有什么区别?
- 6. 比较运算符和逻辑运算符有什么区别?
- 7. 在JavaScript中,运算符'〜'和'!'之间有什么区别?
- 8. 运算符>>>在Java和JavaScript中有什么区别?
- 9. - >带数组的箭头运算符?
- 10. 什么是 - >运算符?
- 11. 什么是()=>运算符?
- 12. 新运算符和Class.newInstance()之间有什么区别?
- 13. PostgreSQL中#>和 - >>运算符有什么区别?
- 14. 如何使用 - >(箭头)运算符?
- 15. ggplot2中的“+”运算符与magrittr中的“%>%”运算符有什么区别?
- 16. 切换箭头运算符
- 17. SQL之间的差异在运算符和“> =”&“<=”运算符之间
- 18. 在php中!=和<>运算符有什么区别?
- 19. 冒号“:”和胖箭头“>”之间的区别是什么?
- 20. 我可以用什么来代替箭头运算符,` - >`?
- 21. MySQL中的<>和!=运算符有什么区别?
- 22. 减法运算符号和符号之间的区别
- 23. Spock中双右箭头运算符(>>)的定义是什么?
- 24. 什么是c运算符>>
- 25. !=和<>运算符有什么区别?
- 26. ->运算符与指针之间的区别*(C++)
- 27. 触发器ruby中的3点范围运算符和2点范围运算符之间的区别
- 28. 重载赋值运算符和任何其他运算符有什么区别?
- 29. =>运算符是做什么的?
- 30. OR运算符||之间的区别和|在Java中?
类似的问题:[点(“”)运算符和箭头(“ - >”)运算符在C对目标C使用( http://stackoverflow.com/q/9072688/642706) –