为什么有些属性需要“强”而有些属性不需要?

时间:2012-06-14 20:52:17

标签: xcode macos cocoa automatic-ref-counting

我正在重写一个旧的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。

1 个答案:

答案 0 :(得分:2)

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

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

init方法结束时使用ARC,编译器将自动插入等效的[_variables release]。因此,它将立即被解除分配。 ebndArray的情况不同,但没有更好。由于您刚刚将其分配给保留计数为0的ivar,因此它将在下一次通过封闭自动释放池的运行循环时自动释放和释放。

如果您希望variablesebndArray的拥有关系通过指定(strong)的setter语义在您的属性声明中这样说。 ARC如何进一步阅读的一个很好的描述是Mike Ash's Blog Post on ARC