标题说明了一切!
在Objective-C中,self.propertyName
与propertyName
之间的区别是什么?
答案 0 :(得分:4)
self.propertyName
正在向对象发送消息,要求其输入propertyName
的值,这意味着它可能会通过getter / setter等等。propertyName
正在直接访问ivar ,绕过任何getter / setter。 Here's an article更详细地介绍了它。
答案 1 :(得分:2)
self.propertyName
指定为属性声明中的保留,则 propertyName
会将保留计数增加1
propertyName不会增加保留计数,可能导致应用程序崩溃。
即G。 ,
@property (nonatomic,retain) NSString* propertyName;
假设您拥有nameProperty
NSString 对象。
下面将保留计数增加1,您可以使用self.propertyName并调用release
。
self.propertyName = nameProperty;
[nameProperty release];
以下不会增加保留计数,因此如果您在应用程序中使用propertyName,则会导致应用程序崩溃。
propertyName = nameProperty;
[nameProperty release];
进一步使用propertyName
会导致崩溃。
答案 2 :(得分:2)
自我。如果使用属性
,则运行可能的合成访问器方法即self.propertyName = newName与[self setPropertyName:newName]相同
这对于内存管理很重要,因为propertyName = newName会导致您松散对propertyName的先前内容的引用
答案 3 :(得分:1)
答案 4 :(得分:1)
点符号由编译器转换为方法调用。这意味着在运行时有额外的工作来执行此方法调用,例如从堆栈内存中复制内容并执行机器代码中的跳转。
实例变量本身更快,因为它本质上只是一个内存地址或标量值(如int)。
当你想要或需要一个额外的层来做某事时,人们更喜欢self.something符号。就像保留一个传入的对象或者在你第一次需要时懒惰地实例化一个对象。
答案 5 :(得分:0)
设置属性的值就是这样 - 它直接设置属性的值而不经过任何访问器或合成访问器。
通过self
调用访问者,您将浏览访问者。对于已使用retain
或copy
声明的属性,它将retain
或copy
传入的值。对于非目标属性,通常的声明为{{1这意味着没有内存管理应用于那些iVars。
您会看到两种类型的调用 - 但最好在初始化程序和assign
方法中使用直接方法,因为在这些方法中不鼓励调用dealloc
。
如果您声明并合成了该属性,则对self
的调用也会为该变量的更改生成KVO通知。这样您就不必编写self
和willChangeValueForKey:
方法。