美文网首页
iOS 单例模式 - 单例对象销毁【@synchronized】

iOS 单例模式 - 单例对象销毁【@synchronized】

作者: Matt_Z_ | 来源:发表于2021-03-30 12:36 被阅读0次

    单例对象的创建方式

    单例.h 文件的实现

    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface NBUser : NSObject
    
    // 创建单例对象
    + (instancetype)sharedInstance;
    
    // 销毁单例对象
    - (void)dellocInstance;
    
    // 用户名
    @property (nonatomic, copy) NSString *username;
    
    // 密码
    @property (nonatomic, copy) NSString *pwd;
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    单例.m 文件的实现

    
    #import "NBUser.h"
    
    @implementation NBUser
    static NBUser *instance = nil;
    + (instancetype)sharedInstance {
        @synchronized(self) {
            if (instance == nil) {
                // 使用super 调用父类等 allocWithZone,避免循环引用
                // 因为重写了 allocWithZone 返回的是 [self sharedInstance],
                // 如果调用了 [self allocWithZone], 就会出现循环调用的问题,
                // 规避循环引用使用 super 进行初始化
                instance = [[super allocWithZone:NULL]init];
            }
        }
        return instance;
    }
    
    // 【必不可少】重写 allocWithZone 方法
    // 因为不使用 sharedInstance 进行创建对象的情况,也是有可能的
    // 比如使用 alloc 进行创建, alloc 会调用 allocWithZone ,
    // 重写 allocWithZone,在内部手动调用 [self sharedInstance] 单例创建对象;
    + (instancetype)allocWithZone:(struct _NSZone *)zone {
        return  [self sharedInstance];;
    }
    
    // 【必不可少】当单例被 copy
    // 外界有可能会对当前实例进行copy操作来创建一个对象,
    // 要保证一个对象在App生命周期内永远只能被创建一次,
    // 我们还需要重写 copyWithZone 方法
    // 直接将 self 返回就可以了
    - (id)copyWithZone:(NSZone *)zone {
        return self;
    }
    
    
    // 销毁单例对象
    - (void)dellocInstance {
        instance = nil;
    }
    @end
    

    单例对象的销毁【@synchronized创建方式】

    使用单例对象的时候,如果我们暂时不用这个对象,同时想释放单例占用的内存空间,所以我们需要把它销毁掉,用的时候在创建出来,那怎么做呢?
    上面的代码是包含这部分功能的,操作的方式就是在销毁的方法里面:直接把 instance 置为nil。

    • 下面是销毁的代码
    // 销毁单例对象
    - (void)dellocInstance {
        instance = nil;
    }
    

    相关文章

      网友评论

          本文标题:iOS 单例模式 - 单例对象销毁【@synchronized】

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