【iOS】单例模式

单例模式在软件开发中经常用到,在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

懒人技巧:把单例的定义与实现定义成宏

【iOS】单例模式
//单例头宏

#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                                          \

{                                                               \

}                                                               \
SingletonDefine
【iOS】单例模式
#import <Foundation/Foundation.h>

#import "SingletonDefine.h"



@interface SingletonClass : NSObject



DEFINE_SINGLETON_HEADER(SingletonClass)



@end
SingletonClass.h
【iOS】单例模式
#import "SingletonClass.h"



@implementation SingletonClass



DEFINE_SINGLETON_IMPLEMENTATION(SingletonClass)                                                        



@end
SingletonClass.m

 

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

懒人模式 

【iOS】单例模式
//单例头宏(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;                                                    \

}                                                                   \
SingletonDefine.h
【iOS】单例模式
#import <Foundation/Foundation.h>

#import "SingletonDefine.h"



@interface SingletonClass : NSObject



DEFINE_SINGLETON_HEADER(SingletonClass)



@end
SingletonClass.h
【iOS】单例模式
#import "SingletonClass.h"



@implementation SingletonClass



DEFINE_SINGLETON_IMPLEMENTATION(SingletonClass)



@end
SingletonClass.m

 

你可能感兴趣的:(单例模式)