我是Objective-c的新人
在编码期间,我遇到了像self-gt; address和self.name
这样的代码
1)什么是 - >和。 (他们是经营者或其他东西)
2)他们之间有什么区别
3)如何决定使用哪一个
如果可能的话请举个小例子
答案 0 :(得分:1)
什么是
fdai0000
和x = [[4], [6, 4, 9], [4, 6], [0], []] reduce(lambda x,y: (len(x) + len(y)) if isinstance(x, list) else (x + len(y)), filter((lambda x: len(x) > 1), x)) # result would be 5
(他们是运营商还是别的什么)?
->
和.
都是运算符of the same (highest) precedence。
他们之间有什么区别?
->
采用指针+字段; .
采用struct +字段或具有可访问getter的指针+属性。
如何决定使用哪一个?
操作的各个方面暗示了这一点,在没有名称冲突的情况下,当两个操作符都可以使用而不会导致编译时错误时,您就不会遇到这种情况。当你有一个指针和一个字段时,使用->
运算符;否则,请使用.
答案 1 :(得分:1)
如果您有object.name
,则在name
上调用名为object
的方法。此方法可以访问它随后返回的实例变量,但它是一个方法,因此它可以执行任何编写的操作。 Objective-C合成属性的方法,因此您可能没有实际的Objective-C代码,但这些方法仍然存在并且可以被覆盖。
使用object->name
,您可以访问name
的实例变量object
。这是对object
内存的直接访问,因此没有方法调用,也没有任何实现/覆盖。
一般情况下,对于对象,您应该使用object.name
来访问该属性,除非有特殊原因不这样做。
注意,当您在对象内部引用实例变量时,它会隐式取消引用self
,即name
与self->name
相同。
答案 2 :(得分:0)
.
是用于访问结构成员的运算符。但是,在Objective-C中,它还用于访问类的属性(通过访问器)。因此,在您的示例中,self.name
用于访问您班级中名为name
的媒体资源。
->
是来自C的解除引用运算符。它用于通过指向它的指针访问结构的成员。在Objective-C中,它还可以用于访问类的成员。在您的示例中,self->address
用于访问您班级中名为address
的成员变量(所谓的ivar)。
看看this answer。