self.propertyName与propertyName之间有什么区别?

时间:2011-06-18 09:34:39

标签: iphone objective-c

标题说明了一切!

在Objective-C中,self.propertyNamepropertyName之间的区别是什么?

6 个答案:

答案 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)

如果你打电话给self,你可以确定你正在调用拥有该属性的类/对象。

您可能也觉得这很有用:

Assigning to self in Objective-C

答案 4 :(得分:1)

点符号由编译器转换为方法调用。这意味着在运行时有额外的工作来执行此方法调用,例如从堆栈内存中复制内容并执行机器代码中的跳转。

实例变量本身更快,因为它本质上只是一个内存地址或标量值(如int)。

当你想要或需要一个额外的层来做某事时,人们更喜欢self.something符号。就像保留一个传入的对象或者在你第一次需要时懒惰地实例化一个对象。

答案 5 :(得分:0)

设置属性的值就是这样 - 它直接设置属性的值而不经过任何访问器或合成访问器。

通过self调用访问者,您将浏览访问者。对于已使用retaincopy声明的属性,它将retaincopy传入的值。对于非目标属性,通常的声明为{{1这意味着没有内存管理应用于那些iVars。

您会看到两种类型的调用 - 但最好在初始化程序和assign方法中使用直接方法,因为在这些方法中不鼓励调用dealloc

如果您声明并合成了该属性,则对self的调用也会为该变量的更改生成KVO通知。这样您就不必编写selfwillChangeValueForKey:方法。