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

singleton(转载)

时间:2015-06-27 01:12:23      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

原 iOS单例宏

发表于10个月前(2014-08-17 00:46)   阅读(687) | 评论(0) 2人收藏此文章, 我要收藏
0

7.16,杭州,阿里巴巴。阿里百川无线开放大会报名开启,用技术驱动无线新商业

摘要 我们每一个人程序员都知道单列模式,可是,有多少人会把单列封装呢?你们有没有考虑过,每次都要写这些固定的东西,是不是很恶心呢?浪费时间……下面简单介绍一下我定义的单列头文件!

 

先别急,先简单提一下单列的概念,当然具体的描述可能仁者见仁智者见智了! 
1.单例设计模式(Singleton) 
1> 什么是单列: 它可以保证某个类创建出来的对象永远只有1个

2> 作用(为什么要用)

  • 节省内存开销
  • 如果有一些数据, 整个程序中都用得上, 只需要使用同一份资源(保证大家访问的数据是相同的,一致的)
  • 一般来说, 工具类设计为单例模式比较合适

3> 怎么实现,老程序员是碰到这样的问题的!arc下就少了!

  • MRC(非ARC)
  • ARC

废话少说,先来看一下我的单例模式下的头文件! 这里主要是__has_feature(objc_arc) 判断了一下是否为arc,所以代码看上去有点多!

<!-- lang: cpp -->
// 帮助实现单例设计模式

// .h文件的实现

define SingletonH(methodName) + (instancetype)shared##methodName;

// .m文件的实现

if __has_feature(objc_arc) // 是ARC

define SingletonM(methodName) \

static id _instace = nil; \

  • (id)allocWithZone:(struct NSZone *)zone \ 
    { \ 
    if (
    instace == nil) { \ 
    static dispatch_once_t onceToken; \ 
    dispatch_once(&onceToken, ^{ \ 
    instace = [super allocWithZone:zone]; \ 
    }); \ 
    } \ 
    return 
    instace; \ 
    } \ 
    \
  • (id)init \ 
    { \ 
    static dispatch_once_t onceToken; \ 
    dispatch_once(&onceToken, ^{ \ 
    instace = [super init]; \ 
    }); \ 
    return 
    instace; \ 
    } \ 
    \
  • (instancetype)shared##methodName \ 
    { \ 
    return [[self alloc] init]; \ 
    } \
  • (id)copyWithZone:(struct NSZone *)zone \ 
    { \ 
    return 
    instace; \ 
    } \ 
    \
  • (id)mutableCopyWithZone:(struct NSZone *)zone \ 
    { \ 
    return 
    instace; \ 
    }

else // 不是ARC

define SingletonM(methodName) \

static id _instace = nil; \

  • (id)allocWithZone:(struct NSZone *)zone \ 
    { \ 
    if (
    instace == nil) { \ 
    static dispatch_once_t onceToken; \ 
    dispatch_once(&onceToken, ^{ \ 
    instace = [super allocWithZone:zone]; \ 
    }); \ 
    } \ 
    return 
    instace; \ 
    } \ 
    \
  • (id)init \ 
    { \ 
    static dispatch_once_t onceToken; \ 
    dispatch_once(&onceToken, ^{ \ 
    instace = [super init]; \ 
    }); \ 
    return 
    instace; \ 
    } \ 
    \
  • (instancetype)shared##methodName \ 
    { \ 
    return [[self alloc] init]; \ 
    } \ 
    \
  • (oneway void)release \ 
    { \ 

    } \ 
    \
  • (id)retain \ 
    { \ 
    return self; \ 
    } \ 
    \
  • (NSUInteger)retainCount \ 
    { \ 
    return 1; \ 
    } \
  • (id)copyWithZone:(struct NSZone *)zone \ 
    { \ 
    return 
    instace; \ 
    } \ 
    \
  • (id)mutableCopyWithZone:(struct NSZone *)zone \ 
    { \ 
    return 
    instace; \ 
    }

endif

这个里面完完全全的做到了,单列所有情况的考虑,包括copy情况,多线程,还有自动判断ARC和MRC情况! 
用的时候只需要在包含头文件然后是用下面 
.h文件下:SingletonH(HttpTool) 
.m文件下:SingletonM(HttpTool)

这东西谁用谁知道!!!!嘻嘻!希望对读者有帮助!

原文:http://my.oschina.net/panyong/blog/302502#OSC_h1_1

singleton(转载)

标签:

原文地址:http://www.cnblogs.com/plummithly/p/4603520.html

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