【问题标题】:What's the differences between the usage of self.property and property [duplicate]self.property 和 property 的用法有什么区别[重复]
【发布时间】:2012-05-14 18:22:41
【问题描述】:

可能重复:
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];

它们似乎都工作正常。这两种用法有什么区别吗?我很困惑。

【问题讨论】:

标签: iphone ios properties


【解决方案1】:

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

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

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

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

所以会丢失一块内存。

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

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

把它当作

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

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

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

【讨论】:

  • 谢谢你的回答,真的很有帮助!
  • 不过有了 ARC,自动引用计数,从 XCode 4.2 开始,你就不用再担心释放你的对象了 ;)
  • 是的,这是很好的一步,但我认为从一年开始,你不应该使用 ARC,只是为了了解内存管理
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 2012-06-08
    • 2011-06-29
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2011-09-27
    相关资源
    最近更新 更多