1

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

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

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

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

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

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

编译器给出错误信息:

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

保留计数是否由设置器增加,使其成为两个,此时?

另外,“调用者当时不拥有”是什么意思?这可能是我不熟悉的问题。

4

2 回答 2

1

也许它会警告您,因为该对象未声明为简单变量,而是由其他东西拥有(在本例中为self),并希望阻止您随机释放对象。

试试这个:

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

或者这个,我通常做的事情:

self.aProperty = [[[UIView alloc] init] autorelease];
于 2012-04-14T15:00:12.230 回答
0

澄清正在发生的事情。

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引出时不会留下任何悬空指针

于 2012-04-14T15:31:15.883 回答