单例模式在软件开发中经常用到,在iOS系统framework也很多地方用到单例模式,例如 [NSUserDefaults standardUserDefaults], [NSBundle mainBundle]等,下面演示一下iOS如何实现单例模式
MRC模式
SingletonClass.h
#import <Foundation/Foundation.h> @interface SingletonClass : NSObject + (SingletonClass *)sharedInstance; @end
SingletonClass.m
#import "SingletonClass.h" @implementation SingletonClass static 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 <Foundation/Foundation.h> #import "SingletonDefine.h" @interface SingletonClass : NSObject DEFINE_SINGLETON_HEADER(SingletonClass) @end
#import "SingletonClass.h" @implementation SingletonClass DEFINE_SINGLETON_IMPLEMENTATION(SingletonClass) @end
ARC模式
SingletonClass.h
#import <Foundation/Foundation.h> @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 <Foundation/Foundation.h> #import "SingletonDefine.h" @interface SingletonClass : NSObject DEFINE_SINGLETON_HEADER(SingletonClass) @end
#import "SingletonClass.h" @implementation SingletonClass DEFINE_SINGLETON_IMPLEMENTATION(SingletonClass) @end