【问题标题】:retain object in objective-c在objective-c中保留对象
【发布时间】:2010-03-10 12:16:24
【问题描述】:

我在做一个set方法:

OBS:somobject 是一个类的属性。

– (void)setSomeObject:(SomeObject *)newSomeobject { [某些对象自动释放]; someobject = [newSomeobject 保留]; 返回; }

关于 [somobject autorelease] 我声明我不想更多地拥有 setSomeObject 范围内的对象。

被另一个对象保留的“someobject”会被释放吗?还是只在 setSomeObject 方法上释放对象?

如果 someobject 类属性已经存在?

这个对象的行为是什么?

【问题讨论】:

    标签: objective-c autorelease


    【解决方案1】:

    我将重命名方法中的参数,使其与 ivar 不同:

    – (void)setSomeObject:(SomeObject *)newObject 
    {
        [someobject autorelease];
    
        someobject = [newObject retain];
    }
    

    您还应该阅读有关内存管理的 Apple 文档以及 @property@synthesize

    【讨论】:

      【解决方案2】:

      你有一个严重的问题,你似乎有两个同名的变量(方法参数和一个实例变量)。编译器(以及这个问题的读者,就此而言)无法分辨您指的是哪个。

      有关内存管理问题,请查看Apple's programming guide.

      【讨论】:

      • 好的,我已经阅读并理解了。谢谢。 someobject 将被释放,属性将设置为另一个属性,并在 newSomeObject 上调用 retain 以确保对象所有权。
      【解决方案3】:

      你需要在 setter 中完成的是:

      1. 释放任何旧对象
      2. 保留新对象
      3. 将新对象分配给您的实例变量

      当然,如果您按字面意思执行此操作,那么在旧对象和新对象相同的情况下,您可能会过早释放对象。这就是“自动释放”派上用场的地方,因为它安排要释放的对象,但仅在您的方法返回之后。

      将方法参数和实例变量命名为相同(恕我直言)令人困惑,并且会给你一个编译器警告,但如果你绝对坚持这样做,你可以使用“self->”来指定你'引用实例变量:

      – (void)setSomeObject:(SomeObject *)someobject {
      
      [self->someobject autorelease];
      
      self->someobject = [someobject retain];
      
      return;
      

      }

      最后,除非您的 setter 方法必须做一些特殊的事情,否则您应该考虑使用 @synthesize 自动生成您的 setter/getter。

      【讨论】:

      • 大卫,你为什么放回车;我在很多例子上也看到了这个,不明白,如果方法会返回为什么要调用return?
      • @okami 没有充分的理由。我复制/粘贴了您的原始代码并忽略了删除“return;”。你说得对,它毫无用处。
      • 但它出现在 Mac Dev Center 的许多示例中。看:developer.apple.com/mac/library/documentation/Cocoa/Conceptual/… 转到“访问者方法”会话
      • 是的,我明白了。但即使在那里,它们也不一致——有些例子有,但有些没有。它肯定一事无成。也许有些作者认为明确地说“不返回任何内容”会增加清晰度? (我碰巧不同意这个想法,但也许有些人同意。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 2020-06-19
      • 2012-12-31
      相关资源
      最近更新 更多