单例模式是iOS开发中最常用的设计模式,单例需要能达到的目的是:
1. 封装一个共享的资源;
2. 提供一个固定的实例创建方法;
3. 提供一个标准的实例访问接口。
iOS中的单例模式有两种写法:
1、单例的常用写法:
#import "ServiceManager.h"
static ServiceManager *defaultManager;
@implementation ServiceManager
+(ServiceManager *)defaultManager{
if(!defaultManager)
defaultManager=[[self allocWithZone:NULL] init];
return defaultManager;
}
@end
2、用GCD创建单例类
#import "ServiceManager.h"
@implementation ServiceManager
+ (ServiceManager *)sharedManager {
static dispatch_once_t predicate;
static ServiceManager *sharedManager;
dispatch_once(&predicate, ^{
sharedManager = [[ServiceManager alloc] init];
});
return sharedManager;
}
@end
// 其中dispatch_once函数只执行一次。
注意:大家平时写单例的时候可能没注意到,如果别人init了这个类,就会创建一个新的对象,要保证永远都只为单例对象分配一次内存空间,写法如下:
+(instancetype) sharedManager {
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^{
_defaultManager = [[super allocWithZone:NULL] init] ;
}) ;
return _defaultManager ;
}
+(id) allocWithZone:(struct _NSZone *)zone {
return [ServiceManager sharedManager] ;
}
-(id) copyWithZone:(struct _NSZone *)zone {
return [ServiceManager sharedManager] ;
}
在对象创建的时候,无论是 alloc 还是 new,都会调用到 allocWithZone: 方法;使用拷贝创建对象时,会调用 copyWithZone:,mutableCopyWithZone:方法;那么,重写这些方法,就可以让创建的对象唯一。