1

我正在重写一个旧的 OS X 程序,并且在此过程中我第一次使用 ARC。我有一个包含这些属性定义的类:

@property NSMutableArray *variables; //variable names
@property NSData *ebndArray; //boundary energies

它们是这样合成的(我没有声明实例变量):

@synthesize variables = _variables;
@synthesize ebndArray = _ebndArray;

init方法包含以下几行:

self.variables = [[NSMutableArray alloc] initWithCapacity:self.npparxx];
self.ebndArray = [NSData dataWithBytesNoCopy:theArray length:arrayLength];

对于variables属性的分配,Xcode 给了我警告将保留的对象分配给不安全的属性ebndArray该物业没有警告。(strong)我知道我可以通过添加到variables属性定义来消除警告(以及由此产生的问题) 。为什么我不需要为ebndArray定义添加它?如果不添加,该ebndArray属性会正常工作(strong)吗?

我在 OS X 10.7.3 下运行 Xcode 4.3.2。

4

1 回答 1

2

未指定 setter 语义时,@property 的默认值为(assign),这意味着合成的 setter 使用简单赋值。那就是您的 init 方法中的两行实际上等同于:

_variables = [[NSMutableArray alloc] initWithCapacity:self.npparxx];
_ebndArray = [NSData dataWithBytesNoCopy:theArray length:arrayLength];

在方法末尾使用 ARC,init编译器将自动插入[_variables release]. 因此,它将立即被释放。情况ebndArray有所不同,但也好不到哪里去。由于您刚刚将它分配给保留计数为 0 的 ivar,它将在下一次通过运行循环时由封闭的自动释放池自动释放和释放。

如果你想要一个拥有关系,variablesebndArray在你的属性声明中通过指定(strong). Mike Ash 在 ARC 上的博客文章很好地描述了 ARC 如何工作以供进一步阅读。

于 2012-06-14T23:58:12.857 回答