我有一个对象工厂,可以分发一些“常量”不可变对象的实例。我希望这些对象能够防止客户端的内存管理不良。这就是我重写类的关键方法的方法。我错过了什么(代码或其他考虑因素)?
- (id)retain
{
return self;
}
- (NSUInteger)retainCount
{
return UINT_MAX;
}
- (void)release
{
// nothing.
}
稍后更新Drive-by问题读者:这是(意图)一个特殊情况,双黑钻石Cocoa问题。如果您正在尝试创建常规单例,请参阅下面有关共享实例的答案等。在选择此实施策略之前,此问题(和所选答案)属于“您应该确定自己知道自己在做什么”
答案 0 :(得分:2)
听起来你正在尝试创建一个单身人士。这是一种非常常见的模式,并且有很多关于它的文章。这些链接应该告诉您需要知道的所有内容:
http://www.mikeash.com/pyblog/friday-qa-2009-10-02-care-and-feeding-of-singletons.html
答案 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)
像这样打破保留/释放合同的想法有一个真正难闻的气味。像保持对类对象中的单例对象的引用是否足够好?因此,您可以防止在正常代码中释放该对象。
如果您只是防止意外过度释放,更好的策略是快速失败并解决原始问题,不是吗?我只是不喜欢解决问题的解决方案,以适应破碎的代码。