self.property和property的使用之间有什么区别

时间:2012-05-05 12:28:01

标签: iphone ios properties

  

可能重复:
  difference between accessing a property via “propertyname” versus “self.propertyname” in objective-c?

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

现在你的问题有什么不同,

不同之处在于,在iVar访问(您的第一行)中,您必须手动释放该对象,并且将保留计数增加1,并且将分配的内存与其相关联。而在self.property中,会分配一个内存,但是当apple属性管理执行此操作时,将为该变量分配一个新块。但保留计数将再次相同。

因此会丢失一块内存。

现在我想告诉一些有益的事情,好的方法是使用对象的属性,因为如果你在接口文件的属性属性中写了retain,那么你的内存管理将在compileres结束,但是记得用dealloc方法写一个release。对于你在这里写的代码行,比如

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

将其用作

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

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

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

答案 1 :(得分:2)

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

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

' property '访问属性的实例变量。

相关问题