码迷,mamicode.com
首页 > 其他好文 > 详细

【学习总结】单例模式

时间:2015-10-23 20:06:31      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:

下面的代码块, 基本是单例模式的完整版本了.

可扩展的地方,可以在init方法中作扩展.

 1 // static 在全局变量的作用域仅限于当前文件内部
 2 static id _instance;
 3 
 4 /**
 5  *  alloc方法内部会调用这个方法 , zone是代表内存块的意思
 6  */
 7 + (id)allocWithZone:(struct _NSZone *)zone
 8 {
 9     // 首先判断防止频繁加锁 , 如果不判断,每次进来先加锁在判断
10     if (_instance == nil) {
11         // 只有第一次为空得时候才进来, 然后加锁. 必须加锁, 防止多线程同时操作同一变量
12         @synchronized(self) {
13             // 某条线程进来之后, 首先判断变量是否为空,如果为空,才执行下面语句
14             if (_instance == nil) {
15                 // 内部默认做法,调用父类方法分配内存空间
16                 _instance = [super allocWithZone:zone];
17             }
18         }
19     }
20     
21     // 直接返回对象
22     return _instance;
23 }
24 
25 /**
26  *  单例模式应该实现一个方法,让别人调用创建,并且创建无数次都应该是同一个对象
27  *
28  */
29 + (instancetype)sharedTool
30 {
31     if (_instance == nil) { // 防止频繁加锁
32         @synchronized(self) {
33             if (_instance == nil) { // 防止创建多次
34                 // alloc 又会调用上面的allocWithZone方法
35                 _instance = [[self alloc] init];
36             }
37         }
38     }
39     return _instance;
40 }
41 
42 // 应该提供该方法, 防止以后别人需要用copy得时候,也保证创建出来的对象是同一对象
43 - (id)copyWithZone:(NSZone *)zone
44 {
45     return _instance;
46 }

 

 

GCD 单例模式

// 用来保存唯一的单例对象, 同样也要加上static,防止别人能修改该字段
static id _instace;

/**
 *
 */
+ (id)allocWithZone:(struct _NSZone *)zone
{
    /**
     *  dispatch_once只会执行一次,而且内部自动封装了锁,更简便安全
     */
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instace = [super allocWithZone:zone];
    });
    return _instace;
}

+ (instancetype)sharedDataTool
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instace = [[self alloc] init];
    });
    return _instace;
}



/**
 *  防止Copy创建对象
 */
- (id)copyWithZone:(NSZone *)zone
{
    return _instace;
}

 

 

以上两种都是单例模式.

 

【学习总结】单例模式

标签:

原文地址:http://www.cnblogs.com/cwllong/p/4905503.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!