self.myivar和self-> myivar在objective-c之间的区别

Dav*_*son 0 objective-c

嗨我知道当使用箭头符号(->)访问C中的成员时,* .每次需要访问对象时都需要同时使用star和dot().

但在Objective-C中,self.myivar和之间有什么区别self->myivar?我注意到它们都适用于我的情况,我将myivar声称为属性.

Cal*_*leb 7

但是在Objective-C中,self.myivar和self-> myivar之间有什么区别吗?

是的,有区别.假设这foo是一个指向对象的指针:

foo->bar等效于(*foo).bardot指示成员访问运算符获取实例变量的位置bar.

foo.bar相当于[foo bar]; 也就是说,它将消息发送-bar到指向的对象foo.这可能只是返回无论是在foobar实例变量,但它可以做其他事情.甚至可能没有名为的实例变量bar.只要有一个被调用的方法-bar,它foo.bar就是有效的.-setBar:如果您使用foo.bar作为作业的左侧,也应该有一种方法,例如:foo.bar = baz;.

请注意,虽然selfObjective-C中是关键字,但它始终充当指向对象的指针.self访问属性或实例变量没有什么特别之处.我使用foo作为对象名称指针上述证明财产/伊娃访问适用于任何对象的指针同样的方式,但你可以替换selffoo以上.

  • 请注意,使用`foo-> bar`可以非常有效地破坏封装.它还绕过了KVO.不要那样做. (2认同)