【发布时间】:2011-01-13 00:50:48
【问题描述】:
使用哪一种同步方法来确保单例仍然是单例?
+(Foo*)sharedInstance
{
@synchronized(self)
{
if (nil == _sharedInstance)
{
_sharedInstance = [[Foo alloc] init];
...
}
}
return _sharedInstance;
}
还是使用互斥锁?
#import <pthread.h>
static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER;
+(Foo*)sharedInstance
{
pthread_mutex_lock(&_mutex);
if (nil == _sharedInstance)
{
_sharedInstance = [[Foo alloc] init];
...
}
pthread_mutex_unlock(&_mutex);
return _sharedInstance;
}
嗯.. 有这方面的 cmets 吗?
【问题讨论】:
-
您可能有兴趣阅读这篇文章 (steve.yegge.googlepages.com/singleton-considered-stupid)。
-
尽管 yegge 讨厌单身人士,但他们在 iPhone 上肯定是有目的的。但是,如果您只是创建一个“命名空间”,请改用类方法。
-
@bentford - 我已经为 iPhone 编程 4 年了,旧代码和新代码。我见过一次使用单例(在一些非常糟糕的代码中)。
-
@HotLicks 我几乎在所有项目中都使用 1 或 2 个单例。两个用例是:1) 处理长时间运行的网络操作和 2) 管理 CoreData 的全局持久上下文。
标签: objective-c multithreading memory-management thread-safety singleton