我是目标c的新手,我有些疑惑。我已经看到你可以访问像 var-> myProperty 这样的类的属性,并且像 variable.myProperty 那样,但我不知道有什么区别2.我在互联网上搜索了很多,但确实没有找到确凿的答案。
很抱歉,如果我有拼写错误,请提前致谢。
答案 0 :(得分:3)
有三种情况需要考虑:
使用someObject.something
使用self->something
使用otherObject->something
someObject.something
是点语法。就行为而言,它完全等同于[someObject something]
。这是一个方法调用。请注意,something
不必通过@property
声明。也就是说,someArray.count
或someString.length
在语法上都是有效的。
self->something
正在直接访问ivar。这是一种很少使用的语法;罕见的是几乎从未。相反,只需使用something =
或[something doSomething]
直接访问ivar即可。无需->
。
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];
。
答案 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
!)。
通常非常简单:除了init
和dealloc
之外,始终使用属性语法,使用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)
在objective-c中查看指针 http://www.drdobbs.com/mobile/pointers-in-objective-c/225700236