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();
[SingletonTemplate destroyInstance];
}
打印结果:
-- ::33.915 MyTestWorkProduct[:] sharedSingletonTemplate:----创建了
-- ::35.990 MyTestWorkProduct[:] dealloc:----释放了
iOS 创建一个在退出登录时可以销毁的单例的更多相关文章
- 使用 Eclipse 创建一个静态的登录页面
要求: 使用 Eclipse 创建一个静态的登录页面 实现步骤: 在 Eclipse 中,点击"File",显示菜单,选择"New" "Other&q ...
- 实战!退出登录时如何借助外力使JWT令牌失效?
大家好,我是不才陈某~ 今天这篇文章介绍一下如何在修改密码.修改权限.注销等场景下使JWT失效. 文章的目录如下: 解决方案 JWT最大的一个优势在于它是无状态的,自身包含了认证鉴权所需要的所有信息, ...
- IOS制作一个漂亮的登录界面
上图是Facebook的登录界面,看起来很漂亮,eamil框和passwod框合在一起,那么这种效果是怎么做出来的呢?我们都知道输入框用layer属性是可以做成圆角的形式,那么怎么样才能够仅仅只让上边 ...
- 用eclipse pydev 创建一个新py文件时 文件的coding设置问题
问题: 当安装好eclipse和pydev后,创建一个project, 创建一个新的py文件,文件头都会自带中文时间.这样在编译的时候会报错. 解决办法之一: 通过设置,可以使新建的文件的文件头自动带 ...
- IOS 创建一个可以随意拉伸不变形的图片
创建一个扩展 UIImage的类 #import "UIImage_Extension.h" @implementation UIImage+Extension /** *返回一张 ...
- iOS传值方式:属性,代理,block,单例,通知
正向传值均可,反向传值除属性传值不可,其余均可.下面简单介绍: (一)属性传值 第二个界面中的lable显示第一个界面textField中的文本 首先我们建立一个RootViewControllers ...
- 自己动手写一个简易对象关系映射,ORM(单例版和数据库池版)
准备知识 DBUtils模块 <<-----重点 DBUtils是Python的一个用于实现数据库连接池的模块 此连接池有两种连接模式: DBUtils提供两种外部接口: Persist ...
- 牛客网Java刷题知识点之什么是单例模式?解决了什么问题?饿汉式单例(开发时常用)、懒汉式单例(面试时常用)、单例设计模式的内存图解
不多说,直接上干货! 什么是单例设计模式? 解决的问题:可以保证一个类在内存中的对象唯一性,必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性. 如何保证? 1.不允许其他程序用new ...
- 单独创建一个Android Test Project 时junit 的配置和使用
现在的集成ADT后Eclipse都可以直接创建Android Test Project 如图所示: 命名后选择你要测试的单元程序,比如我自己准备测试sms,便可以如图所示那样选择 本人新建的测试工程为 ...
随机推荐
- Servlet添加
index .jsp <body> <h1>第一个Servlet</h1> <hr> <a href = "servlet/Hellos ...
- SVN简明课程
Reference: http://www.cnblogs.com/wangkangluo1/archive/2011/08/11/2135312.html 1. 版本控制介绍 1.1. 什么是版本控 ...
- 如何备份、还原或迁移 WhatsApp 的信息和资料?
WhatsApp 会在每天清晨 2 点钟自动创建本地备份文件并将备份文件存储在手机系统设置的文件夹中. Google 云端硬盘 您可以备份对话记录和媒体到 Google 云端硬盘以便日后更换手机时仍可 ...
- 更改pandas dataframe 列的顺序
摘自 stackoverflow 这是我的df: Net Upper Lower Mid Zsore Answer option More than once a day 0% 0.22% -0.12 ...
- spark 中的RDD编程 -以下基于Java api
1.RDD介绍: RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...
- 【bzoj4198】 Noi2015—荷马史诗
http://www.lydsy.com/JudgeOnline/problem.php?id=4198 (题目链接) 题意 一篇文章n个单词,每个出现了${w_i}$次,用k进制数代替单词,使得任意 ...
- 一个好的函数(gcd)求最小公约数
这个函数是我无意中看到的很不错,很给力,我喜欢 是用于求最小公约数的 简单的描述就是,记gcd(a,b)表示非负整数a,b的最大公因数,那么:gcd(a,b)=gcd(b,a%b)或者gcd(a,0) ...
- 单选按钮(RadioButton)与复选框(CheckBox)的功能与用法
单选按钮(RadioButton)和复选框(CheckBox).状态开关按钮(ToggleButton)与开关(Switch)是用户界面中最普通的UI组件,他们都继承了Button类,因此都可直接使用 ...
- myeclipse 2014破解
开始安装的时候已经进行了破解,不知道为什么还是会出现问题,按照下面说的才可以了: http://blog.sina.com.cn/s/blog_7f5862570101oxyv.html
- Storm InvalidTopologyException: null
异常信息: backtype.storm.generated.InvalidTopologyException: null at backtype.storm.daemon.common$valida ...