3

可能重复:
在objective-c中通过“propertyname”与“self.propertyname”访问属性之间的区别?

在我的课堂上,我不确定是否使用 self.property 的属性,例如

  dateFormatter = [[NSDateFormatter alloc] init];
  //or
  self.dateFormatter = [[NSDateFormatter alloc] init];

他们似乎都工作得很好。这两种用法有什么区别吗?我很困惑。

4

2 回答 2

3

属性是你的方法getter和setter,当你通过self.dateformator调用它时,如果你合成了对象和自生成的getter和setter命名(setProperty和getProperty),它将调用属性,

在您的情况下,您的第一行不是属性,您正在直接访问类的 iVar,而在代码的第二行中,您正在使用属性 getter 和 setter 方法,

现在你的问题有什么区别,

不同之处在于,在 iVar 访问(您的第一行)中,您将不得不手动释放对象,并且保留计数会增加 1,并且分配的内存将被分配给它。而在 self.property 中,分配了一个内存,但一个新的块将分配给变量,因为苹果属性管理会这样做。但保留计数将再次相同。

所以一块内存会丢失。

现在我想告诉一些有益的事情,好的方法是使用对象的属性,因为如果你在接口文件的属性中写了保留,那么你的内存管理将在编译器结束,但记得写在 dealloc 方法中释放。对于您在此处编写的代码行,例如

self.someProperty = [[NSArray alloc] init];

用它作为

NSArray* arr = [[NSArray alloc] init];
 self.someProperty = arr;
 [arr release];

现在您的保留计数将与您想要的相同,并且不关心在哪里释放它,如果您编写它,它将在 dealloc 方法中自动释放。

对于您之前编写的那个,您将必须跟踪您必须释放对象的位置

于 2012-05-05T12:56:20.530 回答
2

如果你想使用它的 setter 和 getter 函数,你实际上可以使用self.property 。这是属性的主要功能,它们为您创建 setter 和 getter 方法,而无需您自己编写代码。现在,如果你离开 sel。并且只使用你的property,那么你就不会访问它的任何 getter oder setter 方法。但这在您的情况下并不重要,因为分配和初始化对象不使用 steer 或 getter 方法。这就是为什么这两种方式都为你工作的原因。

' self.property ' 访问属性的 setter 和 getter 方法。

属性”访问属性的实例变量。

于 2012-05-05T12:39:43.060 回答