基本概念:
一个类始终只有一个实例。
创建单例设计模式的基本步骤
1> 声明一个单件对象的静态实例,并初始化为nil。
2> 创建一个类的工厂方法,生成一个该类的实例,当且仅当这个类的实例为nil时。
3> 覆盖 allocWithZone:类方法,确保用户在直接分配和初始化对象时,不会产生另一个对象。
4> 实现 NScopying 协议、覆盖 release、autorelease、retain、retainCount方法,以此确保单例的状态。
注意:如果在 ARC模式下,除了覆盖 NScopying协议中的函数其它都不需要覆盖。
5> 在多线的环境中,注意使用 @synchronized关键字,确保静态实例被正确的创建和初始化。
单例的基本实现
// 定义静态对象和工厂方法
static File *shareFile = nil;
+ (File *)shareFile
{
@synchronized (self) { // 线程保护
// 如果实例为nil,则创建该实例
if (shareFile == nil)
{
shareFile = [[self alloc] init];
}
}
return shareFile;
}
// 覆盖 allocWithZone: 类方法
+ (id)allocWithZone:(NSZone *)zone
{
@synchronized (self) {
if (shareFile == nil)
{
shareFile = [super allocWithZone:zone];
return shareFile;
}
}
return shareFile;
}
// 覆盖 copyWithZone: 方法
- (id)copyWithZone:(NSZone *)zone
{
return shareFile;
}
以下是简单的示例代码:
//
// UserContext.h
// sigtonDemo
//
// Created by harbinxxh on 13-9-5.
// Copyright (c) 2013年 HIT. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface UserContext : NSObject <NSCopying>
+ (id)shareUserContext;
@end
//
// UserContext.m
// sigtonDemo
//
// Created by harbinxxh on 13-9-5.
// Copyright (c) 2013年 HIT. All rights reserved.
//
#import "UserContext.h"
static UserContext *sigtonInstance = nil;
@implementation UserContext
+ (id)shareUserContext
{
@synchronized (self) { // 线程保护
if (sigtonInstance == nil) {
sigtonInstance = [[[self class] alloc] init];
}
}
return sigtonInstance;
}
+ (id)allocWithZone:(NSZone *)zone
{
if (sigtonInstance == nil) {
sigtonInstance = [super allocWithZone:zone];
}
return sigtonInstance;
}
- (id)copyWithZone:(NSZone *)zone
{
return sigtonInstance;
}
@end
//
// main.m
// sigtonDemo
//
// Created by harbinxxh on 13-9-5.
// Copyright (c) 2013年 HIT. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "UserContext.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
UserContext *userContext1 = [UserContext shareUserContext];
UserContext *userContext2 = [UserContext shareUserContext];
UserContext *userContext3 = [UserContext shareUserContext];
UserContext *userContext4 = [UserContext shareUserContext];
// 返回相同的地址值
NSLog(@"userContext1:%p", userContext1);
NSLog(@"userContext1:%p", userContext2);
NSLog(@"userContext1:%p", userContext3);
NSLog(@"userContext1:%p", userContext4);
}
return 0;
}