2

我是目标 c 的新手,我有一些疑问。我已经看到您可以访问诸如var->myProperty之类的类的属性,并且也可以访问variable.myProperty,但是我不知道两者之间有什么区别。我在互联网上进行了很多搜索,但确实没有找到一个决定性的答案。

对不起,如果我有拼写错误,提前谢谢。

4

3 回答 3

3

有三种情况需要考虑:

  • 用于someObject.something

  • 用于self->something

  • 用于otherObject->something

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

self->something正在直接访问 ivar。这是一种很少使用的语法;罕见的几乎从来没有。相反,只需使用something =or直接访问 ivar [something doSomething]。不需要->.

otherObject->somethingotherObject直接在 's 实例变量周围摸索。糟糕的程序员。没有甜甜圈。不要那样做。它破坏了封装并导致代码极其脆弱、难以维护。


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

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

如果你让编译器自动执行@synthesize所有操作,它会创建一个名为_foo.

你应该在你的initanddealloc方法中使用直接访问,但是——通常,虽然不总是——在其他任何地方使用 setter/getter。即在你的init你会做_foo = [SomeClass someClassWithSomeMagicValue:42](假设ARC,所以retain不需要)。在其他任何地方,您都会这样做[[self foo] castMagic];

于 2013-10-26T16:48:36.400 回答
2

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

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

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

现代的 Objective-C 编译器会自动为你创建一个 ivar_foo和属性foo(不需要声明 ivar 和@synthesizeing 属性。

obj.foo然后将自动使用atomicgetter 并生成属性readonly(即没有 setter)。使用 ivar 语法obj->_foo,您正在以非原子方式读取属性(!),您甚至可以编写它(请记住,属性是readonly!)。

通常这很容易:始终使用属性语法,除了在initanddealloc中,您使用 ivar 语法。显然,当您自己实际实现 getter 或 setter 时,这是另一个使用 ivar 语法的地方。(感谢@godel9)。(请记住:这是一个粗略的指导方针,还有其他用例可能需要直接访问 ivar)。

编辑:由于评论中的一些批评:确实,点语法也可以在不声明为 的情况下@property使用,例如使用某些用途array.count而不是[array count](for NSArray *array)。但是鉴于 OP 询问了有关属性与 ivars 的问题,这当然没有被问到。另请注意,对于给定@property ... SomeClass *foo的 ivar 不一定_foo,但这将是最近 ObjC 编译器中自动生成的 ivar 名称(@synthesize您可以将属性映射到任意 ivar)。

于 2013-10-26T13:23:46.650 回答
0

看看 Objective-c 中的指针 http://www.drdobbs.com/mobile/pointers-in-objective-c/225700236

于 2013-10-26T13:22:55.550 回答