自动释放:必须[保留]成员变量?

Posted

技术标签:

【中文标题】自动释放:必须[保留]成员变量?【英文标题】: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] 会有所帮助,但我不明白为什么需要保留类成员。

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于自动释放:必须[保留]成员变量?的主要内容,如果未能解决你的问题,请参考以下文章

成员变量 局部变量

局部变量和全局变量以及成员变量的区别

成员变量类变量局部变量的区别

成员变量(实例变量)&局部变量&静态变量(类变量)的区别

(二十六)成员变量与局部变量

如何将静态 const 变量保留为类的成员