1、基本概念
所谓单例,即某一个类始终只能返回一个实例,也可以理解为类本身就是一个实例。单例类通常适合作为某些保存全局应用信息的全局对象,以及部分耗费大量系统资源的重量级对象。通过这种模式可以更简洁地涉及代码,或者提高应用的性能。常用的单例类有NSFileManager、NSUserDefault等。
2、创建单例涉及模式的基本步骤
(1)创建单例对象的静态实例,初始化为nil;
(2)创建类的类工厂方法,只有在这个类的实例为nil时生成一个该类的实例;
(3)重写allocWithZone方法,防止在alloc时产生另一个对象;
(4)实现NSCopy协议,覆盖release、autorelease、retain、retainCount方法以保证单例的状态;
(5)多线程环境中,使用@synchronized关键字,确保静态实例正确创建和初始化。
以下是一个单例类的定义事例:
// // UserContext.h // SingletonDemo // // Created by YinWenjie on 14-12-11. // Copyright (c) 2014年 YinWenjie. All rights reserved. // #import <Foundation/Foundation.h> @interface UserContext : NSObject @property (nonatomic, copy) NSString *strName; @property (nonatomic, copy) NSString *strAddr; + (id)shareContext; @end // // UserContext.m // SingletonDemo // // Created by YinWenjie on 14-12-11. // Copyright (c) 2014年 YinWenjie. All rights reserved. // #import "UserContext.h" static UserContext *singletonInstance = nil; @implementation UserContext + (id)shareContext { @synchronized(self) { if (singletonInstance == nil) { singletonInstance = [[[self class] alloc] init]; } } return singletonInstance; } #pragma mark - Make sure that only one instance is created + (id)allocWithZone:(struct _NSZone *)zone { if (singletonInstance == nil) { singletonInstance = [super allocWithZone:zone]; } return singletonInstance; } - (id)copyWithZone:(struct _NSZone *)zone { return singletonInstance; } - (id)retain { return singletonInstance; } - (oneway void)release { } - (id)autorelease { return singletonInstance; } - (NSUInteger)retainCount { return UINTMAX_MAX; } @end