gpt4 book ai didi

objective-c - 这个 iOS 单例实现的任何潜在缺陷?

转载 作者:行者123 更新时间:2023-12-01 17:44:48 25 4
gpt4 key购买 nike

最直接和最简单的实现是这样的

static MySingleton *_instance = nil;

+ (MySingleton *) instance
{
@synchronized (_instance)
{
if (_instance == nil)
{
_instance = [[MySingleton alloc] init];
}

return _instance;
}
}

其实我知道几个关于单例的热门帖子,比如
Implementing a Singleton in iOS
和流行音乐 template

所以我的问题是“上述实现的任何缺陷”?

最佳答案

是的,您的实现存在很大缺陷。 @synchronized指令变成对 objc_sync_enter 的调用稍后调用 objc_sync_exit .当您调用instance第一次方法,_instancenil . objc_sync_enter如果你传递它,函数不会锁定nil ,正如你所看到的 looking at its source code .

所以如果两个线程同时调用instance之前 _instance已初始化,您将创建 MySingleton 的两个实例.

此外,你应该把 _instance函数内部的变量,除非您有理由将其公开给整个源文件。

iOS 4.0 及更高版本的单例访问器的首选实现使用非常高效的 dispatch_once功能和看起来像这样:

+ (MySingleton *)sharedInstance {
static MySingleton *theInstance;
static dispatch_once_t once;
dispatch_once(&once, ^{
theInstance = [[self alloc] init];
});
return theInstance;
}
dispatch_once功能在iOS 4.0之前不可用,所以如果你真的需要支持旧的iOS版本(这不太可能),你必须使用效率较低的 @synchronized .由于您无法在 nil 上同步,你在类对象上同步:
+ (MySingleton *)sharedInstance {
static volatile MySingleton *theInstance;
if (!theInstance) {
@synchronized (self) {
if (!theInstance)
theInstance = [[self alloc] init];
}
}
return theInstance;
}

关于objective-c - 这个 iOS 单例实现的任何潜在缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9459319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com