zoukankan      html  css  js  c++  java
  • iOS单例模式

    今天才知道单例模式分为严格单例模式不严格单例模式

    单例模式要求一个类有一个实例,有公开接口可以访问这个实例。

    严格单例模式,要求一个类只有一个实例;不严格单例模式,可以创建多个实例。

    严格单例模式:重载 copy()、mutableCopy() 方法,返回 self,防止在外部复制实例

    不严格单例模式: 继承自 NSObject,重载 copy()、mutableCopy() 方法,创建新实例,传递数据给新实例,返回新实例。其他与严格单例模式相同。

    1.不重载 copy()、mutableCopy() 方法:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        // 不写allocWithZone <Singleton: 0x60000001b020>-<Singleton: 0x60000001b090>-<Singleton: 0x60000001b020>
        
        Singleton *instance = [Singleton shared];
        Singleton *instance1 = [[Singleton alloc]init];
        Singleton *instance2 = [Singleton shared];
        NSLog(@"%@-%@-%@",instance, instance1, instance2);
    }

    2.重载 copy()、mutableCopy() 方法:

    //
    //  Singleton.m
    //  单例模式
    //
    //  Created by 思 彭 on 2017/4/28.
    //  Copyright © 2017年 思 彭. All rights reserved.
    //
    
    #import "Singleton.h"
    
    static id shared;
    
    @implementation Singleton
    
    // 仅实现此方法则是不严格单例
    
    + (nonnull instancetype)shared {
        
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            
            shared = [[self alloc]init];
        });
        return shared;
    }
    
    // 实现以下方法即是:严格单例
    
    /**
     重载 allocWithZone: 和 init 方法,由 dispath_once 保证父类方法只执行一次并给 shared 赋值,返回 shared。外部调用初始化方法总是获得 shared 持有的唯一实例。
     @param zone <#zone description#>
     @return <#return value description#>
     */
    + (instancetype)allocWithZone:(struct _NSZone *)zone {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            shared = [super allocWithZone:zone];
        });
        return shared;
    }
    
    - (instancetype)init {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            shared = [super init];
        });
        return shared;
    }
    
    
    /**
     重载 copyWithZone: 和 mutableCopyWithZone: 方法,返回 self,防止在外部复制实例。由于只有一个实例 shared,只能由 shared 调用 copy、mutableCopy 方法,那么 self 就是 shared。
    
     @param zone <#zone description#>
     @return <#return value description#>
     */
    - (id)copyWithZone:(NSZone *)zone {
    //    return self;
        return [[self.class allocWithZone:zone]init];
    }
    
    - (id)mutableCopyWithZone:(NSZone *)zone {
    //    return self;
        return [[self.class allocWithZone:zone]init];
    }
    
    // Optional
    - (void)reset {
        // Reset all properties to default value
    }
    
    @end

    返回结果:

    <Singleton: 0x608000019a30>-<Singleton: 0x608000019a30>-<Singleton: 0x608000019a30>

     

    好像没发现啥区别??

    不重载方法:alloc和单例创建的是不一样的对象;

    重载了方法: alloc和单例创建的是一样的对象;

     

    可以参考这个博客,挺详细:  http://www.cnblogs.com/silence-cnblogs/p/6776217.html

     

    你简单的理解,欢迎给我留言!!谢谢哟!

     

  • 相关阅读:
    Dask教程
    python程序—利用socket监控端口
    python程序—封装案例
    python程序—士兵出击
    Python三大神器:装饰器,迭代器,生成器
    python程序—名片管理系统
    python程序—系统检测
    python程序—用户登录
    (七)javac编译
    Unity系统消息广播
  • 原文地址:https://www.cnblogs.com/pengsi/p/6780309.html
Copyright © 2011-2022 走看看