zoukankan      html  css  js  c++  java
  • 【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

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

    //单例头宏
    #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
    #import <Foundation/Foundation.h>
    #import "SingletonDefine.h"
    
    @interface SingletonClass : NSObject
    
    DEFINE_SINGLETON_HEADER(SingletonClass)
    
    @end
    SingletonClass.h
    #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

    懒人模式 

    //单例头宏(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
    #import <Foundation/Foundation.h>
    #import "SingletonDefine.h"
    
    @interface SingletonClass : NSObject
    
    DEFINE_SINGLETON_HEADER(SingletonClass)
    
    @end
    SingletonClass.h
    #import "SingletonClass.h"
    
    @implementation SingletonClass
    
    DEFINE_SINGLETON_IMPLEMENTATION(SingletonClass)
    
    @end
    SingletonClass.m
  • 相关阅读:
    1. Change the emulator screen size
    Dynamic Programming for TSP
    框架的概念及用反射技术开发框架的原理
    【PHP 】 伪静态
    【PHP 】伪静态
    框架-Java:Spring MVC
    开源-解决方案-实时数据追踪:Zipkin 介绍
    报表-类型:瀑布图
    报表:目录
    软件-开发软件-Java-Eclipse:百科
  • 原文地址:https://www.cnblogs.com/bomo/p/4504520.html
Copyright © 2011-2022 走看看