【问题标题】:Autorelease: Must [ retain] on member variables?自动释放:必须[保留]成员变量?
【发布时间】:2012-05-27 12:20:51
【问题描述】:

假设我有一个BasicEngine 课程:

@interface BasicEngine : GfxEngine{

    NSMutableDictionary *keyNodes;
    AbstractVirtualJoystick *input0;
}

相关实现如下:

@implementation BasicEngine
- (id)init {

    if ( (self = [super init]) ) {

        keyNodes = [NSMutableDictionary dictionary];
    }
    return self;
}

我的理解是调用[ dictionary] 会返回一个自动释放的对象。但是,只要BasicEngine 实例可用,该字典就应该保存在内存中。

我意识到我错过了一些东西,因为keyNodes 很快变成了nil 对象。 在init 方法中使用[keyNodes retain] 会有所帮助,但我不明白为什么需要保留类成员。

请帮助我理解这一点:-) 谢谢。

【问题讨论】:

    标签: objective-c memory-management retain autorelease


    【解决方案1】:

    retain 表示保留者对保留者的所有权。由于keyNodes 是一个类成员,您的引擎“拥有”它,因此应该在它上面使用retain

    在后台retain 正在增加keyNodes 上的引用计数,这向系统发出信号,表明又有一个对象有兴趣将keyNodes 指向的任何内容保留在内存中。同样,您应该在dealloc 方法中对keyNodes 调用release,这将减少保留计数,因为您的引擎不再“拥有”keyNodes

    【讨论】:

    • 啊,感谢您提供清晰简洁的解释,一定要把它添加到我的备忘单中;-) 感谢 Kevboh!
    • 没问题。如果您还有任何问题,请告诉我,我很乐意为您解答。 Apple 也有一些关于内存管理的优秀文档here
    【解决方案2】:

    如果您想在BasicEngine 可用之前维护keyNodes 对象,您还可以使用单例模式来实现它们以使其成为静态。

    另请参阅:http://xperienced.com.pl/blog/3-ways-to-implement-singleton-pattern-in-objective-c

    【讨论】:

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