【问题标题】:Retaining an Assigned Instance Variable Property保留分配的实例变量属性
【发布时间】:2012-02-12 16:44:12
【问题描述】:

我有一个属性有(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];

【问题讨论】:

  • 发布一个代码示例,说明您正在做什么。

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


【解决方案1】:

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

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

这至少提供了一些保护,以防“一些东西”部分碰巧修改了self.interestingView。而且它可能也会满足静态分析器。

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

【讨论】:

  • 好答案; temp 变量使正在发生的事情更加清晰。将release 发送到属性访问的结果通常也是一个坏主意。 IOW,仅在访问器方法(和init/dealloc)内管理 ivar 内存。
  • @JoshCaswell 我同意,我会补充的。要么使用属性来管理内存,要么自己做,但不能两者兼而有之。
【解决方案2】:

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

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

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

或者你可以使用一个临时变量。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      相关资源
      最近更新 更多