var-> myProperty和var.myProperty之间的区别

时间:2013-10-26 13:15:56

标签: objective-c class variables object properties

我是目标c的新手,我有些疑惑。我已经看到你可以访问像 var-> myProperty 这样的类的属性,并且像 variable.myProperty 那样,但我不知道有什么区别2.我在互联网上搜索了很多,但确实没有找到确凿的答案。

很抱歉,如果我有拼写错误,请提前致谢。

3 个答案:

答案 0 :(得分:3)

有三种情况需要考虑:

  • 使用someObject.something

  • 使用self->something

  • 使用otherObject->something

someObject.something点语法。就行为而言,它完全等同于[someObject something]。这是一个方法调用。请注意,something不必通过@property声明。也就是说,someArray.countsomeString.length在语法上都是有效的。

self->something正在直接访问ivar。这是一种很少使用的语法;罕见的是几乎从未。相反,只需使用something =[something doSomething]直接访问ivar即可。无需->

otherObject->something直接围绕otherObject的实例变量。糟糕的程序员。没有甜甜圈。不要那样做。它破坏了封装,导致代码非常脆弱,难以维护。


关于@property声明的说明。如果你有:

 @property (atomic, strong, readonly) SomeClass *foo;

如果您让编译器自动@synthesize所有内容,它将创建一个名为_foo的实例变量。

您应该在initdealloc方法中使用直接访问权限,但是 - 通常(尽管并非总是) - 在其他地方使用setter / getter。即在您的init中,您会_foo = [SomeClass someClassWithSomeMagicValue:42](假定为ARC,因此不需要retain)。在其他任何地方,你都会[[self foo] castMagic];

答案 1 :(得分:2)

obj->foo语法访问foo的ivar obj,而obj.foo访问属性(由@property定义)。主要区别在于obj->foo不使用任何getter / setter并直接写入ivar。

例如,如果您定义了这样的属性

@property (atomic, strong, readonly) SomeClass *foo;

现代Objective-C编译器会自动为您创建一个ivar _foo和属性foo(无需声明ivar和@synthesize该属性。

然后

obj.foo会自动使用atomic getter并生成属性readonly(即没有setter)。使用ivar语法obj->_foo,您正在非原子地(!)读取属性,甚至可以编写它(请记住,属性为readonly!)。

通常非常简单:除了initdealloc之外,始终使用属性语法,使用ivar语法。显然当你实际上自己实现一个getter或setter时,那是另一个使用ivar语法的地方。 (感谢@ godel9)。 (请记住:这是一个粗略的指导原则,还有其他用例可能需要直接进行ivar访问)。

编辑:由于评论中的一些批评:确实也可以使用点语法而不用@property声明某些内容,例如某些使用array.count代替[array count](适用于NSArray *array)。但鉴于OP询问了物业与伊娃的关系,当然不会问。另请注意,对于给定的@property ... SomeClass *foo,ivar不一定是_foo,但这是最近ObjC编译器中自动生成的ivar名称(@synthesize可以将属性映射到任意ivars)

答案 2 :(得分:0)