创建一个“永久”的Cocoa对象

时间:2010-05-14 03:23:20

标签: objective-c cocoa memory-management

我有一个对象工厂,可以分发一些“常量”不可变对象的实例。我希望这些对象能够防止客户端的内存管理不良。这就是我重写类的关键方法的方法。我错过了什么(代码或其他考虑因素)?

- (id)retain
{
    return self;
}

- (NSUInteger)retainCount
{
    return UINT_MAX;
}

- (void)release
{
    // nothing.
}

稍后更新Drive-by问题读者:这是(意图)一个特殊情况,双黑钻石Cocoa问题。如果您正在尝试创建常规单例,请参阅下面有关共享实例的答案等。在选择此实施策略之前,此问题(和所选答案)属于“您应该确定自己知道自己在做什么”

4 个答案:

答案 0 :(得分:2)

听起来你正在尝试创建一个单身人士。这是一种非常常见的模式,并且有很多关于它的文章。这些链接应该告诉您需要知道的所有内容:

http://www.mikeash.com/pyblog/friday-qa-2009-10-02-care-and-feeding-of-singletons.html

http://boredzo.org/blog/archives/2009-06-17/doing-it-wrong

当然还有Apple文档herehere

答案 1 :(得分:1)

您可能还想覆盖copyWithZone:autorelease

- (id)copyWithZone:(NSZone *)zone
{
    return self;
}

- (id)autorelease
{
    return self;
}

答案 2 :(得分:1)

嗯,真的让它永久化:

- (void) dealloc
{
    return;
    [super dealloc]; // stop compiler warning
}

但是,这有什么优势呢?您的客户是否遵循记录良好的内存管理规则?

答案 3 :(得分:1)

像这样打破保留/释放合同的想法有一个真正难闻的气味。像保持对类对象中的单例对象的引用是否足够好?因此,您可以防止在正常代码中释放该对象。

如果您只是防止意外过度释放,更好的策略是快速失败并解决原始问题,不是吗?我只是不喜欢解决问题的解决方案,以适应破碎的代码。