保留已分配的实例变量属性

时间:2012-01-17 21:39:50

标签: iphone objective-c cocoa-touch memory memory-management

我有一个属性为(nonatomic, assign)的属性。

在一种方法中,然后我retaining变量,然后releasing变成一行。

静态分析器发出警告incorrect decrement of the reference count of object...

我可以不这样做吗

@property (nonatomic, assign) Class *iVar;

            [self.iVar retain];
            [self.iVar removeFromSuperview];
            [self insertSubview:self.iVar atIndex:self.iVar.index];
            [self.iVar release];

3 个答案:

答案 0 :(得分:2)

由于保留和释放都发生在同一个方法中,您可能希望将该属性复制到局部变量,然后使用该属性:

UIView *someView = self.interestingView;
[someView retain];
//...do some stuff...
[someView release];

如果“某些东西”部分恰好修改self.interestingView,那至少可以提供一些保护。它也可能满足静态分析仪。

一般情况下,我会避免保留/释放那些支持这些属性的访问器之外的属性的变量,除了一些明确定义的情况,例如-dealloc。同样,避免直接保留/释放属性访问的结果,如[self.foo retain]中所示。如果在发布之前更改了该属性,则最终会导致泄漏,以及稍后的过度释放。

答案 1 :(得分:1)

麻烦的是你没有使用变量;你正在使用属性访问器的结果。每次访问该属性时,静态分析器都会对从方法返回的对象应用正常的内存管理规则 - 即,您不应该释放它。如果将其更改为使用实际的本地或实例变量,则警告将消失。

答案 2 :(得分:0)

我刚测试了一个类似的例子,

您将通过不使用属性表示法来安抚静态分析器

[iVar retain];
[self.iVar removeFromSuperview];
[self insertSubview:self.iVar atIndex:self.iVar.index];
[iVar release];

或者您可以使用临时变量。