保留属性的引用计数减少不正确

时间:2012-04-14 14:54:29

标签: objective-c memory-management

我想我还是不明白这一点。我没有在这个项目上使用ARC。

对于使用retain属性声明的属性aProperty,我希望在以下语句中将指定的对象保留两次:

self.aProperty = [UIView alloc] init...];

一次来自alloc,一次来自setter。

所以我立即释放了一个对象,如下所示:

self.aProperty = [UIView alloc] init...];
[self.aProperty release];

编译器给出错误消息:

  

此时不拥有的对象的引用计数的不正确递减   由来电者。

保留计数是否由设定者增加,在此时为两个?

此外,“来电者不拥有”的意思是什么?这可能是我不熟悉的问题。

2 个答案:

答案 0 :(得分:1)

也许它会警告你,因为对象没有被声明为一个简单的变量,而是被其他东西所拥有(在这种情况下,self),并希望阻止你随机释放对象。

尝试以下方法:

UIView *view [UIView alloc] init...];
self.aProperty = view;
[view release];

或者这就是我通常做的事情:

self.aProperty = [[[UIView alloc] init] autorelease];

答案 1 :(得分:0)

澄清正在发生的事情。

self.myVar = [[UIView alloc] initWithFrame:frame];

相当于调用

[self setMyVar:[[UIView alloc] initWithFrame:frame]];

当使用@property时保留它的实现最终会看起来像这样(这只是一个粗略的例子)

- (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,因为存在stil +1保留而导致内存泄漏。

我赞成的模式是

UIView *myVar = [[UIView alloc] initWithFrame:frame];
self.myVar = myVar;
[myVar release]; myVar = nil;

以便尽快释放内存,并且不会留下任何悬空指针,因为它是nil'导出