- 单例必须是唯一的,所以它才被称为单例。在一个应用程序的生命周期里,有且只有一个实例存在。单例的存在给我们提供了一个唯一的全局状态。比如我们熟悉的NSNotification,UIApplication和NSUserDefaults都是单例。
- 为了保持一个单例的唯一性,单例的构造器必须是私有的。这防止其他对象也能创建出单例类的实例。感谢所有帮我指出这点的人。
- 为了确保单例在应用程序的整个生命周期是唯一的,它就必须是线程安全的。当你一想到并发肯定一阵恶心,简单来说,如果你写单例的方式是错误的,就有可能会有两个线程尝试在同一时间初始化同一个单例,这样你就有潜在的风险得到两个不同的单例。这就意味着我们需要用GCD的dispatch_once来确保初始化单例的代码在运行时只执行一次
oc下单例的创建
<pre name="code" class="objc">@interface HttpManager : NSObject
+ (HttpManager *)defaultManager;
@end
@implementation HttpManager
+ (HttpManager *)defaultManager
{
static dispatch_once_t once_t = 0;
__strong static id defaultHttpManager = nil;
dispatch_once(&once_t, ^{
defaultHttpManager = [[self alloc] init];
});
return defaultHttpManager;
}
swift版:
class Tool: NSObject {
static let sharedTool = Tool()
// 私有化构造方法,阻止其他对象使用这个类的默认的'()'构造方法
private override init() {}
}