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

单例对象

时间:2015-11-21 19:38:53      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

在开发中经常需要使用单例对象。今天主要说的是单例宏

首先先简单介绍一下

1.单例设计模式(Singleton)

1> 什么: 它可以保证某个类创建出来的对象永远只有1个

 

2> 作用(为什么要用)

* 节省内存开销

* 如果有一些数据, 整个程序中都用得上, 只需要使用同一份资源(保证大家访问的数据是相同的,一致的)

* 一般来说, 工具类设计为单例模式比较合适

 

3> 怎么实现

* MRC(非ARC)

* ARC

 

代码采用的是mrc的环境

单独创建一个.h文件 例如SingleTon.h

 1 //帮助实现单例设计模式
 2 /*
 3  alloc方法内部会调用allocWithZone
 4  */
 5 
 6 #define SingletonH(methodName) +(instancetype)shared##methodName;
 7 
 8 #if __has_feature(objc_arc)//是arc
 9 
10 #define SingletonM(methodName)11 static id _instance = nil;12 13 +(instancetype)allocWithZone:(struct _NSZone *)zone14 {15     16     if(_instance == nil)17     {18         static dispatch_once_t onceToken;19         dispatch_once(&onceToken, ^{20             _instance = [super allocWithZone:zone];21         });22     }23     return _instance;24 }25 +(instancetype)shared##methodName26 {27     return [[self alloc]init];28 }29 
30 #else//不是arc
31 
32 #define SingletonM(methodName)33 static id _instance = nil;34 35 +(instancetype)allocWithZone:(struct _NSZone *)zone36 {37 38 if(_instance == nil)39 {40 static dispatch_once_t onceToken;41 dispatch_once(&onceToken, ^{42 _instance = [super allocWithZone:zone];43 });44 }45 return _instance;46 }47 -(oneway void)release48 {49 50 }51 52 -(instancetype)retain53 {54 return self;55 }56 -(NSUInteger)retainCount57 {58 return 1;59 }60 +(instancetype)shared##methodName61 {62 return [[self alloc]init];63 }
64 
65 #endif

\代表的含义是说:下一行属于它  

然后在使用的时候

soundTool.h文件

#import <Foundation/Foundation.h>
#import "singleTon.h"
@interface soundTool : NSObject
SingletonH(sound)
@end

 soundTool.m文件

#import "soundTool.h"

@implementation soundTool
//注意里边的方法名不要跟类名相同(大小写都不行得)
SingletonM(sound)

@end

 

然后在controller.m文件中

- (void)viewDidLoad {
    [super viewDidLoad];
    dataTool *d1 = [dataTool shareddatatools];
    dataTool *d2 = [dataTool shareddatatools];
    soundTool *s1 = [soundTool sharedsound];
    soundTool *s2 = [soundTool sharedsound];
    NSLog(@"%p %p ",d1,d2);
    NSLog(@"%p %p ",s1,s2);
    

 这样就能报保证多个类都是单例的

 

有时候 出现mrc 跟arc 混编的状况  

这样的话在个别的文件  的配置文件中追加 -fobjc-arc (说明是arc文件)

 

还有时候可能碰见这样的代码

 //补充
    NSArray *array = [[NSArray alloc]init];
    //判断如果不是arc状态的话  进行array的释放
    #if !__has_feature(objc_arc)
        [array release];
    #endif

 这个说明判断如果不是arc环境的话 就要对array进行释放

单例对象

标签:

原文地址:http://www.cnblogs.com/lishanshan/p/4984307.html

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