gpt4 book ai didi

objective-c - Apple 的 Sample MVCNetworking 中的 Singleton Class NetworkManager 是否正确?

转载 作者:可可西里 更新时间:2023-11-01 04:44:40 26 4
gpt4 key购买 nike

这里是示例代码的链接 http://developer.apple.com/library/ios/#samplecode/MVCNetworking/Introduction/Intro.html

下面是文件 NetworkManager.m 中的代码片段

+ (NetworkManager *)sharedManager
// See comment in header.
{
static NetworkManager * sNetworkManager;

// This can be called on any thread, so we synchronise. We only do this in
// the sNetworkManager case because, once sNetworkManager goes non-nil, it can
// never go nil again.

if (sNetworkManager == nil) {
@synchronized (self) {
sNetworkManager = [[NetworkManager alloc] init];
assert(sNetworkManager != nil);
}
}
return sNetworkManager;
}

显然这里存在线程安全问题。当有多个线程时,可能会创建两个 NetworkManager 实例。所以 Apple 犯了一个错误,对吧?

最佳答案

是的,你是对的。它会在并发环境中出现问题。更好的方法是在 alloc 之前使用双重检查:

+ (NetworkManager *)sharedManager
{
static NetworkManager * sNetworkManager;
if (sNetworkManager == nil) {
@synchronized (self) {
if (sNetworkManager == nil) {
sNetworkManager = [[NetworkManager alloc] init];
assert(sNetworkManager != nil);
}
}
}
return sNetworkManager;
}

而且有很多方法可以使用 Ojbective-C 编写单例,查看这篇文章:What should my Objective-C singleton look like?

更新

BobCromwell 是对的。 double check lock苹果不推荐,苹果Threading Programming Guide中的文档:

A double-checked lock is an attempt to reduce the overhead of taking a lock by testing the locking criteria prior to taking the lock. Because double-checked locks are potentially unsafe, the system does not provide explicit support for them and their use is discouraged.`

关于objective-c - Apple 的 Sample MVCNetworking 中的 Singleton Class NetworkManager 是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10039700/

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