单例模式在软件开发中经常用到,在iOS系统framework也很多地方用到单例模式,例如 [NSUserDefaults standardUserDefaults], [NSBundle mainBundle]等,下面演示一下iOS如何实现单例模式
MRC模式
SingletonClass.h
#import@interface SingletonClass : NSObject+ (SingletonClass *)sharedInstance;@end
SingletonClass.m
#import "SingletonClass.h"@implementation SingletonClassstatic SingletonClass *_singletonInstance = nil; + (instancetype)sharedInstance{ @synchronized(self){ if (!_singletonInstance) { _singletonInstance = [[self alloc] init]; } } return _singletonInstance; } + (id)allocWithZone:(NSZone *)zone{ @synchronized(self){ if (!_singletonInstance) { _singletonInstance = [super allocWithZone:zone]; } return _singletonInstance; } return nil; } - (instancetype)copyWithZone:(NSZone *)zone; { return self; } - (instancetype)retain { return self; } - (unsigned)retainCount { return UINT_MAX; } - (instancetype)autorelease { return self; } - (oneway void)release { } @end
懒人技巧:把单例的定义与实现定义成宏
//单例头宏#define DEFINE_SINGLETON_HEADER(className) \ + (className *)sharedInstance; \//单例实现宏#define DEFINE_SINGLETON_IMPLEMENTATION(className) \static className *_singletonInstance = nil; \+ (instancetype)sharedInstance{ \ @synchronized(self){ \ if (!_singletonInstance) { \ _singletonInstance = [[self alloc] init]; \ } \ } \ return _singletonInstance; \} \ \+ (id)allocWithZone:(NSZone *)zone{ \ @synchronized(self){ \ if (!_singletonInstance) { \ _singletonInstance = [super allocWithZone:zone]; \ } \ return _singletonInstance; \ } \ return nil; \} \ \- (instancetype)copyWithZone:(NSZone *)zone; \{ \ return self; \} \ \- (instancetype)retain \{ \ return self; \} \ \- (unsigned)retainCount \{ \ return UINT_MAX; \} \ \- (instancetype)autorelease \{ \ return self; \} \ \- (oneway void)release \{ \} \
#import#import "SingletonDefine.h"@interface SingletonClass : NSObjectDEFINE_SINGLETON_HEADER(SingletonClass)@end
#import "SingletonClass.h"@implementation SingletonClassDEFINE_SINGLETON_IMPLEMENTATION(SingletonClass) @end
ARC模式
SingletonClass.h
#import@interface SingletonClass : NSObject+ (instancetype)sharedInstance;//禁用alloc,init,new 创建对象,否则编译会报错+(instancetype) alloc __attribute__((unavailable("alloc not available, call sharedInstance instead")));-(instancetype) init __attribute__((unavailable("init not available, call sharedInstance instead")));+(instancetype) new __attribute__((unavailable("new not available, call sharedInstance instead")));@end
SingletonClass.m
#import "SingletonClass.h"@implementation SingletonClass+(instancetype) sharedInstance { static dispatch_once_t predicate; static SingletonClass *instance = nil; dispatch_once(&predicate, ^{ instance = [[super alloc] initUniqueInstance]; }); return instance; } -(instancetype) initUniqueInstance { return [super init]; } - (instancetype)copyWithZone:(NSZone *)zone { return self; }@end
懒人模式
//单例头宏(ARC)#define DEFINE_SINGLETON_HEADER(className) \+ (instancetype)sharedInstance; \//单例实现宏(ARC)#define DEFINE_SINGLETON_IMPLEMENTATION(className) \+(instancetype) sharedInstance { \ static dispatch_once_t predicate; \ static className *_singletonInstance = nil; \ dispatch_once(&predicate, ^{ \ _singletonInstance = [[super alloc] init]; \ }); \ return _singletonInstance; \} \ \- (instancetype)copyWithZone:(NSZone *)zone \{ \ return self; \} \
#import#import "SingletonDefine.h"@interface SingletonClass : NSObjectDEFINE_SINGLETON_HEADER(SingletonClass)@end
#import "SingletonClass.h"@implementation SingletonClassDEFINE_SINGLETON_IMPLEMENTATION(SingletonClass)@end