• iOS 创建一个在退出登录时可以销毁的单例


    一、单例简介

    单例模式是在软件开发中经常用的一种模式。单例模式通俗的理解是,在整个软件生命周期内,一个类只能有一个实例对象存在。

    二、遇到的问题

    在平时开发使用单例的过程中,有时候会有这样的需求,在用户登录成功时,将用户的信息记录在用户信息单例中,当用户退出登录后,因为这个用户单例的指针被静态存储器的静态变量引用着,导致用户单例不能释放,直到程序退出或者杀死后,内存才能被释放。那有没有一种方法能够在单例不需要的时候就释放掉,而不要等到App结束呢?下面就介绍一种可以销毁的单例。

    三、代码

    说的再多不如一句代码来的实在,直接上代码。

    单例类如下所示:

    SingletonTemplate.h文件

    #import <Foundation/Foundation.h>
    
    @interface SingletonTemplate : NSObject
    /*!**生成单例***/
    + (instancetype)sharedSingletonTemplate;
    /*!**销毁单例***/
    + (void)destroyInstance;
    @end

    SingletonTemplate.m文件

    static SingletonTemplate *_instance=nil;
    
    @implementation SingletonTemplate
    
    + (instancetype)sharedSingletonTemplate {
        
        static dispatch_once_t onceToken;
        
        dispatch_once(&onceToken, ^{
            _instance=[[self alloc] init];
            
            NSLog(@"%@:----创建了",NSStringFromSelector(_cmd));
        });
        return _instance;
    }
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instance = [super allocWithZone:zone];
        });
        return _instance;
    }
    
    + (void)destroyInstance {
    
        _instance=nil;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return _instance;
    }
    
    - (void)dealloc {
        NSLog(@"%@:----释放了",NSStringFromSelector(_cmd));
    }

    四、代码介绍

    关于代码.h文件中有两个方法,一个是生成单例,另一个是销毁单例;其中销毁单例方法,是将静态存储区的静态变量指针置为nil,这样单例对象在没有任何指针指向的情况下被系统回收了。

    运行程序,打印的结果如下

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [SingletonTemplate sharedSingletonTemplate];
        
        sleep(2);
        
        [SingletonTemplate destroyInstance];
        
    }
    
    
    
    打印结果:
    
    2017-02-27 22:42:33.915 MyTestWorkProduct[3550:78078] sharedSingletonTemplate:----创建了
    2017-02-27 22:42:35.990 MyTestWorkProduct[3550:78078] dealloc:----释放了
  • 相关阅读:
    洛谷P2415 集合求和
    八数码难题解法大全
    P1789 【Mc生存】插火把
    P1554 梦中的统计
    CentOS6.4 安装 Oracle11g
    湖南省第八届大学生程序设计大赛原题 D
    选择排序(直接选择、堆排序)
    改变Emacs下的注释代码方式以支持当前行(未选中情况下)的注释/反注释
    cocos2d-x游戏开发(十五)游戏加载动画loading界面
    SIMPASS技术解析
  • 原文地址:https://www.cnblogs.com/zhou--fei/p/6476783.html
Copyright © 2020-2023  润新知