关于—单例模式
? 实现目的– 保证在内存中用类实例化出来的对象永远是一个(即实例化对象的内存地址永远是一个)
? 实现方法: 声明一个静态成员变量,记录唯一实例 重写allocWithZone方法 当对象用alloc初始化分配内存空间时,最终会调用allocWithZone法,重写该方法,保证只会分配一个内存空间 便于方便,可以建立sharedXXX类方法,便于其他类访问
要创建单例,需要以下几个步骤
1> 定义一个全局的静态变量,保存第一次被实例化出来的对象,并在后续使用
2> 重写allocWithZone方法,并利用dispatch_once_t包装实例化对象
3> 创建sharedXXX类方法,以便日后使用
4>关于互斥锁@synchronized,被被强夺的资源要设置为原子属性,保证线程安全
PS:本文以实例化seat为例,
--------------------------------------<.h文件 >-------------------------------------------
#import <Foundation/Foundation.h>
@interface Seat : NSObject
+ (instancetype)sharedSeat;
//此属性已经设为原子属性,为了使用互斥锁
@property (atomic, assign) NSInteger seats;
@end
--------------------------------------<.m文件 >-------------------------------------------
#import "Seat.h"
// 全局静态变量,因为是在类方法中使用,所以要用静态变量
static Seat *_instance;
@implementation Seat
+ (id)allocWithZone:(struct _NSZone *)zone
{
// dispatch_once_t是gcd提供的,此方法可以确保在多线程中,始终实例化的对象是一个
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
// 此方法仅适合在单线程用
// if (_instance == nil) {
// _instance = [super allocWithZone:zone];
// }
return_instance;
}
//提供的工厂方法,方便调用
+ (instancetype)sharedSeat
{
if (_instance == nil) {
_instance = [[Seat alloc] init];
}
return_instance;
}
@end
原文:http://www.cnblogs.com/ly1973/p/3573845.html