您的位置:首页 > 移动开发 > IOS开发

iOS常用设计模式之单例模式

2015-07-19 18:17 543 查看
单例模式是iOS设计模式中常用的一种设计模式,它的意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的作用就是为了解决“应用中只有一个实例”这一类问题。

单例模式一般会封装一个静态属性,并提供静态实例的创建方法。下面上代码:

//
//  Singleton.h
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/19.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import @interface Singleton : NSObject

+ (Singleton *)shareManager;

@end


//
//  Singleton.m
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/19.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import "Singleton.h"

@implementation Singleton

static Singleton *_shareManager = nil;

+ (Singleton *)shareManager {
static dispatch_once_t once;
dispatch_once(&once, ^{
_shareManager = [[self alloc] init];
});

return _shareManager;
}

@end


如果使用者能严格按照要求来使用给定的方法,这个单例还是可以的,但是,如果不小心调用了其他可以生成对象的方法,那这个单例就失去了它的作用。所以,这个单例还需要改造:

1、重写allocWithZone方法,保证使用者在调用alloc或者init的时候不会产生新的对象。

2、重写copyWithZone和mutableCopyWithZone方法,保证使用者在进行对象复制的时候不会产生新的对象。

3、看情况重写retain、retainCount、release和autorelease方法。(ARC模式下需要注释掉)

重新改造的单例如下:

//
//  Singleton.m
//  DesignPatternsDemo
//
//  Created by 韩学鹏 on 15/6/19.
//  Copyright (c) 2015年 韩学鹏. All rights reserved.
//

#import "Singleton.h"

@implementation Singleton

static Singleton *_shareManager = nil;

+ (Singleton *)shareManager {
static dispatch_once_t once;
dispatch_once(&once, ^{
_shareManager = [[self alloc] init];
});
return _shareManager;
}

+ (id)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t once;
dispatch_once(&once, ^{
_shareManager = [super allocWithZone:zone];
});

return _shareManager;
}

- (id)copyWithZone:(NSZone *)zone {
return _shareManager;
}

- (id)mutableCopyWithZone:(NSZone *)zone {
return [self copyWithZone:zone];
}
/*   ARC无效时
- (id)retain {
return _shareManager;
}

- (NSUInteger)retainCount {
return 1;
}

- (oneway void)release {

}

- (id)autorelease {
return _shareManager;
}
*/

@end


测试代码和输入输出结果:

id obj = [Singleton new];
id obj1 = [Singleton shareManager];
id obj2 = [[Singleton alloc] init];

NSLog(@"obj:%@", obj);
NSLog(@"obj1:%@", obj1);
NSLog(@"obj2:%@", obj2);


输出:

2015-06-19 19:15:27.452 DesignPatternsDemo[24125:607] obj:2015-06-19 19:15:27.453 DesignPatternsDemo[24125:607] obj1:2015-06-19 19:15:27.453 DesignPatternsDemo[24125:607] obj2:


附上这个类的下载地址:单例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: