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