iOS轻松使用单例

作者: 尼古拉斯超仔 | 来源:发表于2017-04-11 15:31 被阅读183次

    一、单例模式:

    单例模式不需要传递任何参数,就有效地解决了不同代码间的数据共享问题。单例类是一个非常重要的概念,因为它们表现出了一种十分有用的设计模式。单例类的应用贯穿于整个iOS的SDK中。例如,UIApplication类有一个方法叫sharedApplication,从任何地方调用这个方法,都将返回与当前正在运行的应用程序相关联的UIApplication实例。除了这个,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(应用程序设置) 、NSURLCache(请求缓存)、NSHTTPCookieStorage(应用程序cookies池)都是系统单例;单例类保证了应用程序的生命周期中有且仅有一个该类的实例对象,而且易于外界访问。

    二、单例模式的要点:

    1、某个类只能有一个实例。
    2、它必须自行创建这个实例。
    3、它必须自行向整个系统提供这个实例。

    三、单例模式的优点:

    1、实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。 
    2、灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程IOS中的单例模式。

    四、创建一个单例至少需要四个步骤:

    1、为单例对象实现一个静态实例,并初始化,然后设置成nil。
    2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例。
    3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实例的时候不产生一个新实例。
    4、适当实现copyWithZone。
    Demo:创建一个单例类SingletonClass,定义它的属性和方法。
    .h

    #import <Foundation/Foundation.h>
    
    @interface SingletonClass : NSObject
    @property (assign, nonatomic)int age;//定义一个属性
    //单例方法
    +(SingletonClass *)sharedInstance;
    @end
    
    

    .m

    #import "SingletonClass.h"
    
    @implementation SingletonClass
    //1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
    static SingletonClass *manager = nil;
    
    //2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
    +(SingletonClass *)sharedInstance{
        
        @synchronized(self) {
            if(manager == nil) {
                manager = [[SingletonClass  alloc] init];
            }
        }
        return manager;
    }
    
    //3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实例的时候不产生一个新实例,
    +(id)allocWithZone:(NSZone *)zone{
        @synchronized(self){
            
            if (!manager) {
                
                manager = [super allocWithZone:zone]; //确保使用同一块内存地址
                
                return manager;
                
            }
            
            return nil;
        }
    }
    
    //4、适当实现copyWithZone,确保copy对象也是唯一
    - (id)copyWithZone:(NSZone *)zone{
        
        return self;
        
    }
    //初始化方法,初始化自己的属性
    - (id)init{
        @synchronized(self) {
            
            if (self = [super init]){
                self.age = 10;
                return self;
            }
            
            return nil;
        }
    }
    
    @end
    
    

    使用:#import "SingletonClass.h"

    SingletonClass *singleton = [SingletonClass sharedInstance];
    singleton.age = 15;
    

    相关文章

      网友评论

        本文标题:iOS轻松使用单例

        本文链接:https://www.haomeiwen.com/subject/qmtuattx.html