可能重复:
在objective-c中通过“propertyname”与“self.propertyname”访问属性之间的区别?
在我的课堂上,我不确定是否使用 self.property 的属性,例如
dateFormatter = [[NSDateFormatter alloc] init];
//or
self.dateFormatter = [[NSDateFormatter alloc] init];
他们似乎都工作得很好。这两种用法有什么区别吗?我很困惑。
可能重复:
在objective-c中通过“propertyname”与“self.propertyname”访问属性之间的区别?
在我的课堂上,我不确定是否使用 self.property 的属性,例如
dateFormatter = [[NSDateFormatter alloc] init];
//or
self.dateFormatter = [[NSDateFormatter alloc] init];
他们似乎都工作得很好。这两种用法有什么区别吗?我很困惑。
属性是你的方法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 方法中自动释放。
对于您之前编写的那个,您将必须跟踪您必须释放对象的位置
如果你想使用它的 setter 和 getter 函数,你实际上可以使用self.property 。这是属性的主要功能,它们为您创建 setter 和 getter 方法,而无需您自己编写代码。现在,如果你离开 sel。并且只使用你的property,那么你就不会访问它的任何 getter oder setter 方法。但这在您的情况下并不重要,因为分配和初始化对象不使用 steer 或 getter 方法。这就是为什么这两种方式都为你工作的原因。
' self.property ' 访问属性的 setter 和 getter 方法。
“属性”访问属性的实例变量。