澄清正在发生的事情。
self.myVar = [[UIView alloc] initWithFrame:frame];
相当于调用
[self setMyVar:[[UIView alloc] initWithFrame:frame]];
当使用@propertywith retain 它的实现最终看起来像这样(这只是一个粗略的例子)
- (void)setMyVar:(UIView *)myVar;
{
if (_myVar != myVar) {
[_myVar release];
_myVar = [myVar retain];
}
}
所以现在我们可以这么说
+----------- +1 retain ------------+
| |
[[UIView alloc] initWithFrame:frame]
和
+------ +1 retain ----+
| |
_myVar = [myVar retain];
这是计数的+2。然后我们会有类似的东西
- (void)dealloc;
{
[_myVar release];
[super dealloc];
}
这是-1,这只会给我们留下内存泄漏,因为仍然有+1保留。
我喜欢的模式是
UIView *myVar = [[UIView alloc] initWithFrame:frame];
self.myVar = myVar;
[myVar release]; myVar = nil;
以便尽快释放内存,并且在被nil引出时不会留下任何悬空指针