我有一个属性为(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];
答案 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];
或者您可以使用临时变量。