我是新的目标c,我有一些疑惑。我已经看到你可以访问一个类的属性,如var-> myProperty等也是这样variable.myProperty,但我不知道2之间的区别是什么。我在网上搜索了很多,真的没有找到确凿的答案。var-> myProperty和var.myProperty之间的区别
对不起,如果我有拼写错误,提前致谢。
我是新的目标c,我有一些疑惑。我已经看到你可以访问一个类的属性,如var-> myProperty等也是这样variable.myProperty,但我不知道2之间的区别是什么。我在网上搜索了很多,真的没有找到确凿的答案。var-> myProperty和var.myProperty之间的区别
对不起,如果我有拼写错误,提前致谢。
的obj->foo
语法访问的obj
而obj.foo
访问属性(由@property
定义)的ivar foo
。主要区别在于obj->foo
不使用任何getter/setter并直接写入ivar。
例如,如果你像这样定义
@property (atomic, strong, readonly) SomeClass *foo;
财产
现代的Objective-C编译器会自动创建伊娃_foo
并为你的财产foo
(无需申报伊娃和@synthesize
荷兰国际集团的属性。
obj.foo
将自动使用atomic
getter和将财产readonly
(即没有setter)使用伊娃语法obj->_foo
,您正在阅读的属性非原子盟友(!),你甚至可以写它(记住,该属性是readonly
!)。
通常很简单:始终使用属性语法,除了在init
和dealloc
之外,您使用的是ivar语法。很明显,当你实际上实现了一个getter或setter时,这是另一个使用ivar语法的地方。 (感谢@ godel9)。 (记住:这是一个粗略的指导方针,还有其他的用例可能需要直接ivar访问)。
编辑:由于在评论一些批评:这是真的,点语法,也没有声明什么作为@property
使用,例如一些使用array.count
代替[array count]
(用于NSArray *array
)。但鉴于OP询问了物业与Ivars的关系,这当然没有被问到。另请注意,对于给定的@property ... SomeClass *foo
,伊娃不一定是_foo
,但这将是最近ObjC编译器中自动生成的伊娃尔名称(可以将属性映射到任意伊瓦尔)。
有三种情况来考虑:
使用someObject.something
使用self->something
使用otherObject->something
someObject.something
是点语法。就行为而言,它完全等同于[someObject something]
。这是一个方法调用。请注意,something
不必通过@property
进行声明。也就是说,someArray.count
或someString.length
在语法上都是有效的。
self->something
正在直接访问伊娃。这是一个很少使用的语法;难得在几乎从未。相反,只需使用something =
或[something doSomething]
直接访问伊娃。不需要->
。
otherObject->something
直接围绕着otherObject
的实例变量。糟糕的程序员。没有甜甜圈。不要这样做。它打破封装并导致非常脆弱,难以维护的代码。
上@property
声明的说明。如果您有:
@property (atomic, strong, readonly) SomeClass *foo;
如果您自动让编译器@synthesize
一切,它会创建一个名为_foo
实例变量。
您应该在您的init
和dealloc
方法中使用直接访问,但是 - 通常(尽管不总是) - 在其他地方使用setter/getter。即在你的init
你会做_foo = [SomeClass someClassWithSomeMagicValue:42]
(假设ARC,所以没有retain
需要)。在其他地方,你会做[[self foo] castMagic];
。
现在我明白了,非常感谢你! –
另一个使用伊娃语法的地方是自定义getter和setter。 – godel9
显然是真的,补充说。 –