iOS设计模式之单例模式
2013-10-30 21:42
218 查看
单例模式是iOS常用设计模式中的一种。单例设计模式的作用是使得这个类的一个对象成为系统中的唯一实例,因此需要用一种唯一的方法去创建这个对象并返回这个对象的地址。那么,我们何时使用单例模式呢?1、类只能有一个实例,而且必须从一个为人熟知的访问点对其访问。2、这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。
那么用Objective-C如何实现单例模式呢?下面我们来新建一个Singleton类,在Singleton.h中实现如下
@interface Singleton : NSObject
+ (Singleton *) sharedInstance;
@end
在Singleton.m
@implementation Singleton
static Singleton * sharedSingleton = nil;
+ (Singleton *) sharedInstance
{
if (sharedSingleton == nil) {
sharedSingleton = [[Singleton alloc] init];
}
return sharedSingleton;
}
@end
这样就创建一个简单的单例模式,实际上有一部分程序员也是这样实现的,但实际上这是一个不“严格”版本,在实际中使用,可能会遇到发起调用的对象不能以其他分配方式实例化单例对象,否则,就会创建多个实例。(之前有人和我讨论过这个问题,说使用者应该严格按照接口来使用,当实际上Singleton是一个对象,我们不能保证使用者不会使用其他的方法去创建(比如alloc),这个时候他就会创建多个实例,这样就会出现这些无法感知的bug)
下面我对Singleton.m的进行改进
@implementation Singleton
static Singleton * sharedSingleton = nil;
+ (Singleton *) sharedInstance
{
if (sharedSingleton == nil) {
sharedSingleton = [[super allocWithZone:NULL] init];
}
return sharedSingleton;
}
+ (id) allocWithZone:(struct _NSZone *)zone
{
return [[self sharedInstance] retain];
}
- (id) copyWithZone:(NSZone *) zone
{
return self;
}
- (id) retain
{
return self;
}
- (NSUInteger) retainCount
{
return NSUIntegerMax;
}
- (void) release
{
//
}
- (id) autorelease
{
return self;
}
@end
也许你注意到了,我重载了allocWithZone:,保持了从sharedInstance方法返回的单例对象,使用者哪怕使用alloc时也会返回唯一的实例(alloc方法中会先调用allocWithZone:创建对象)。而retain等内存管理的函数也被重载了,这样做让我们有了把Singleton类变得“严格”了。
那么用Objective-C如何实现单例模式呢?下面我们来新建一个Singleton类,在Singleton.h中实现如下
@interface Singleton : NSObject
+ (Singleton *) sharedInstance;
@end
在Singleton.m
@implementation Singleton
static Singleton * sharedSingleton = nil;
+ (Singleton *) sharedInstance
{
if (sharedSingleton == nil) {
sharedSingleton = [[Singleton alloc] init];
}
return sharedSingleton;
}
@end
这样就创建一个简单的单例模式,实际上有一部分程序员也是这样实现的,但实际上这是一个不“严格”版本,在实际中使用,可能会遇到发起调用的对象不能以其他分配方式实例化单例对象,否则,就会创建多个实例。(之前有人和我讨论过这个问题,说使用者应该严格按照接口来使用,当实际上Singleton是一个对象,我们不能保证使用者不会使用其他的方法去创建(比如alloc),这个时候他就会创建多个实例,这样就会出现这些无法感知的bug)
下面我对Singleton.m的进行改进
@implementation Singleton
static Singleton * sharedSingleton = nil;
+ (Singleton *) sharedInstance
{
if (sharedSingleton == nil) {
sharedSingleton = [[super allocWithZone:NULL] init];
}
return sharedSingleton;
}
+ (id) allocWithZone:(struct _NSZone *)zone
{
return [[self sharedInstance] retain];
}
- (id) copyWithZone:(NSZone *) zone
{
return self;
}
- (id) retain
{
return self;
}
- (NSUInteger) retainCount
{
return NSUIntegerMax;
}
- (void) release
{
//
}
- (id) autorelease
{
return self;
}
@end
也许你注意到了,我重载了allocWithZone:,保持了从sharedInstance方法返回的单例对象,使用者哪怕使用alloc时也会返回唯一的实例(alloc方法中会先调用allocWithZone:创建对象)。而retain等内存管理的函数也被重载了,这样做让我们有了把Singleton类变得“严格”了。
相关文章推荐
- iOS设计模式 - (3)简单工厂模式
- IOS开发之----单例设计模式
- iOS开发中的几种设计模式
- IOS设计模式学习(1)设计模式初窥
- iOS设计模式之一:MVC模式和单例模式
- iOS 设计模式 - 备忘录模式
- IOS设计模式学习 生成器
- 实例讲解iOS应用的设计模式开发中的Visitor访问者模式
- iOS中常用的几种设计模式
- iOS设计模式之一(MVC模式,单例模式)
- iOS设计模式--工厂模式
- iOS设计模式之—单例模式浅谈
- iOS MVVM设计模式
- 如何理解 iOS Delegate (委托)设计模式
- iOS 设计模式MVC
- iOS学习2_代理设计模式
- iOS设计模式之观察者模式
- iOS设计模式之单例模式
- 从今天开始学习iOS开发(iOS 7版)--实现一款App之使用设计模式
- IOS开发中的几种设计模式介绍