基本问题是Objective-C属性语法

Run*_*oop 4 cocoa cocoa-touch objective-c

关于Objective C中属性的语法和用法,我有几个基本问​​题:

假设标题中包含以下声明:

@interface TestObject : NSObject {

    NSArray *myArray;
}

@property (nonatomic, retain) NSArray *myArray;
Run Code Online (Sandbox Code Playgroud)

在实施中,我可以:

  1. 项目清单
  2. 使用myArrayself.myArray互换用于设置和获取目的?
  3. self.myArray = nil相当于[myArray release]
    如果是这样,是否有理由使用self.myArray = nil而不是[myArray release]

and*_*n22 5

  1. myArrayself.myArray实际上是不同的.myArray正在直接访问变量,而self.myArray(相当于[self myArray])正在调用一个访问器方法.大多数人都同意你应该一直使用self.myArray(或[self myArray]),而不是myArray直接使用.这是因为访问者可能有副作用; 例如,如果直接设置变量,KVO将无法工作,并且不会为您处理内存管理.

  2. 您的属性声明为retain,所以self.myArray = anArray([self setMyArray:anArray]与以下内容相同)执行以下操作:

    1. 保留anArray,很快将成为新的myArray.
    2. 释放旧的myArray,很快就不再是myArray了.
    3. 更改指针myArray,使它现在指向anArray.

因此,当您这样做时self.myArray = nil,其中一个步骤(#2)确实会释放旧数组.(而且由于新版本nil,我们不必担心它的内存管理,即使我们保留它.)所以是的,self.myArray = nil是一种有效的发布方式myArray.

但是,如果你在谈论释放myArraydealloc,它通常是用一个好主意[myArray release],因为调用self.myArray = nil都会有副作用,如果任何其它目的是观察myArray通过志愿.因此,尽管它遵循内存管理的标准,它不是写你一个好主意dealloc的使用方法self.myArray = nil.

  • @JK随意使用`self.myArray = nil;`除了你的`dealloc`方法以外的任何地方. (2认同)