2012-04-14 44 views
1

我想我还是不明白这一点。我没有在这个项目上使用ARC。保留属性的引用计数递减不正确

对于PROPERT,aProperty与保留属性声明,我希望的是,分配的对象是在下面的语句保留两次:

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

一旦从ALLOC,并且一旦被制定者。

所以有一次我立即释放对象,像这样:

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

编译器给出错误信息:

的未在这一点上拥有的对象的引用计数错误减量来电者拨打 。

保留计数是否被setter递增,使得它在这个点上是两个?

另外,“呼叫者没有拥有”的意思是什么?这可能是我不熟悉的问题。

+0

可能重复。属性释放\]会导致静态分析器显示“引用计数的错误递减”错误?](http://stackoverflow.com/questions/9005751/why-self-property-release-will-cause-the-静态分析器显示不正确) – 2012-04-14 17:47:47

回答

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“引出的[为什么\ [自我

1

也许它警告你,因为该对象没有被声明为简单变量,而是被其他人所拥有(在本例中为self),并且希望阻止你随机释放对象。

尝试无论是这样的:

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

还是这个,我通常做的:

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

我做了这个,而不是:[dataToBeLoaded_发布];错误信息消失了。这使得它看起来好像你不应该释放该属性。我仍然需要从某人那里得到验证,证明它已被保留两次并需要发布。 (我尽可能避免自动释放,尽可能保持游泳池尽可能小。) – Jim 2012-04-14 15:05:29

+0

'autorelease'非常好,真的。即使多次使用它,我也没有注意到对性能有任何不良影响。也许编译器甚至会优化代码以在没有'autorelease'的情况下工作? – 2012-04-14 15:14:18

+0

该对象确实获得了两次“保留”,因此需要一个“释放”。要释放对象,请发送第二个释放消息(您可能在对象自己的“-dealloc”中执行此操作) – 2012-04-14 15:15:06