• 代理设计模式


    单例设计模式确保对于一个给定的类只有一个实例存在,这个实例有全局唯一的访问点。例如NSUserDefaults、UIApplication、NSFileManager、以及封装网络工具类时使用。

    代理设计模式,通常发送者和接收者的是一对一关系,目的是改变或传递控制链,允许一个类在某些特定时刻通知其他类,而不需要获取其他类的指针。在UIKit中大量使用代理。

      

    单例模式的书写

    ARC

    // 定义一个静态变量,在程序运行过程中只有1份
    
    static id instance;
    - ( instancetype ) init
    {
        static id obj = nil;
    
    //onceToken初始为0
        static dispatch_once_t onceToken; 
    
      // 确保只执行一次初始化代码
    dispatch_once(&onceToken, ^{
         //执行过后, onceToken变为-1,block内代码不再执行
         if ((obj = [super init]))
        {
              // 加载资源
              NSLog(@"加载资源");
        }
          });
        return obj;
    }
    
    
    
    // 重写这个方法控制内存只分配一次
    +(instancetype)allocWithZone:(struct _NSZone *)zone{
    
        static dispatch_once_t onceToken;
    
     // 里面的代码只会执行1次
      dispatch_once(&onceToken, ^{
        instance = [super allocWithZone:zone];
        });
    
      // 返回对象
        return instance;
    }
    
    // 确保复制的对象还是同一个
    
    - (id)copyWithZone:(NSZone *)zone
     {
       return self;
    }
    
     // 全局访问点
    
    + (instancetype)sharedAudioTool 
    {
       return [[self alloc] init];
    }
    

    OC 中的单例

      + (instancetype)sharedManager
     {
          static id instance;
          static dispatch_once_t onceToken;
          NSLog(@"%ld", onceToken);
          dispatch_once(&onceToken, ^{
              instance = [[self alloc] init];
          });
          return instance;
      }
    

    根据OC单例 改写成 Swift 中的单例

    static var instance: Tools?
    static var token: dispatch_once_t = 0
    class func sharedInstance() -> Tools
     {
      dispatch_once(&token) { () -> Void in
          instance = Tools()
      }
      return instance!
    }
    

    OC调用swift,需要#import "单例-Swift.h",其中单例为Product Name 在 Swift 中 let 本身就是线程安全的

    改进过的单例代码

    static let instance = Tools()
    class func sharedInstance() -> Tools 
    {
      return instance
    }
    

    单例其实还可以更简单 

    最终形态

    static let sharedTools = Tools()
  • 相关阅读:
    网络协议栈(6)RFC793TCP连接时部分异常流程及实现
    网络协议栈(5)sendto/send返回成功意味着什么
    LeetCode——Detect Capital
    LeetCode——Find All Numbers Disappeared in an Array
    LeetCode——Single Number
    LeetCode——Max Consecutive Ones
    LeetCode——Nim Game
    LeetCode——Reverse String
    LeetCode——Next Greater Element I
    LeetCode——Fizz Buzz
  • 原文地址:https://www.cnblogs.com/xu-antong/p/6399705.html
Copyright © 2020-2023  润新知