我想我还是不明白这一点。我没有在这个项目上使用ARC。
对于使用retain属性声明的属性aProperty
,我希望在以下语句中将指定的对象保留两次:
self.aProperty = [UIView alloc] init...];
一次来自alloc,一次来自setter。
所以我立即释放了一个对象,如下所示:
self.aProperty = [UIView alloc] init...];
[self.aProperty release];
编译器给出错误消息:
此时不拥有的对象的引用计数的不正确递减 由来电者。
保留计数是否由设定者增加,在此时为两个?
此外,“来电者不拥有”的意思是什么?这可能是我不熟悉的问题。
答案 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
'导出