自动释放:必须[保留]成员变量?
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
【讨论】:
以上是关于自动释放:必须[保留]成员变量?的主要内容,如果未能解决你的问题,请参考以下文章