我有几个关于 Objective C 中属性的语法和用法的基本问题:
假设标题中有以下声明:
@interface TestObject : NSObject {
NSArray *myArray;
}
@property (nonatomic, retain) NSArray *myArray;
在实现中,我可以:
- 列表项
- 交替使用
myArray
和self.myArray
来设置和获取目的? self.myArray = nil
是否等同于[myArray release]
?
如果是这样,是否有理由使用self.myArray = nil
而不是[myArray release]
?
最佳答案
myArray
和self.myArray
实际上是不同的。myArray
正在直接访问变量,而self.myArray
(相当于[self myArray]
)正在调用访问器方法。大多数人同意您应该使用self.myArray
(或[self myArray]
),永远不要使用myArray
直接地。这是因为访问器可能有副作用;例如,如果您直接设置变量,KVO 将无法工作,并且不会为您处理内存管理。您的属性(property)声明为
retain
, 所以self.myArray = anArray
(与[self setMyArray:anArray]
相同)执行以下操作:- 保留一个数组,它很快就会成为新的 myArray。
- 释放旧的 myArray,它很快就不再是 myArray。
- 更改指针 myArray,使其现在指向 anArray。
因此,当您执行 self.myArray = nil
,其中一个步骤 (#2) 确实是释放旧数组。 (因为新的是 nil
,我们不必担心它的内存管理,即使我们保留了它。)所以是的,self.myArray = nil
是释放 myArray
的有效方式.
但是,如果您正在谈论发布 myArray
在dealloc
, 通常使用 [myArray release]
是个好主意, 因为调用 self.myArray = nil
如果有任何其他对象正在观察,将会产生副作用 myArray
通过 KVO。因此,虽然它确实遵循内存管理标准,但编写您的 dealloc
并不是一个好主意。使用 self.myArray = nil
的方法.
关于objective-c - 关于 Objective-C 属性语法的基本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2426849/