首页 > 其他 > 详细

关于—单例模式

时间:2014-03-01 03:23:54      阅读:404      评论:0      收藏:0      [点我收藏+]

关于—单例模式
? 实现目的– 保证在内存中用类实例化出来的对象永远是一个(即实例化对象的内存地址永远是一个)

? 实现方法: 声明一个静态成员变量,记录唯一实例 重写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

关于—单例模式,布布扣,bubuko.com

关于—单例模式

原文:http://www.cnblogs.com/ly1973/p/3573845.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!