今天被问到了一个问题:如何让请求的类延迟释放

如果要延迟释放或者在程序整个生命周期都存在可以考虑两种方式,一是定义一个静态变量,二是用单例。用单例本质上用的是静态变量。

单例的写法如下:

+ (instancetype)sharedInstance

{

static AFNetworkingTool *_afNetWorkingTool = nil;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

//code to be executed once

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

_afNetWorkingTool = [[AFNetworkingTool alloc] initWithSessionConfiguration:configuration];

});

return _afNetWorkingTool;

}

静态变量写法:

+ (instancetype)sharedInstance

{

static AFNetworkingTool *_afNetWorkingTool = nil;

if (!_afNetWorkingTool) {

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

_afNetWorkingTool = [[AFNetworkingTool alloc] initWithSessionConfiguration:configuration];

}

return _afNetWorkingTool;

}

这两种方法还是有些区别的,我最后选择了定义一个静态局部变量的方法。后面我会说明为什么没有选择单例。

其中AFNetworkingTool 继承自AFURLSessionManager。可以看到,把AFNetworkingTool的实例对象定义成了一个静态局部变量,这样作为静态变量,它的生命周期是整个程序。免去了每次请求都要创建的情况,直到应用结束才会释放分配的内存,避免由于频繁的请求,导致频繁的内存请求和释放。

这次文章分享主要想聊一下常用的几种变量:局部变量,全局变量/外部变量,静态局部变量,静态全局变量。

局部变量:{}内定义的变量可以称之为局部变量,作用域在调用函数,内存存储方式为动态存储,生命周期在调用函数运行周期,函数结束后释放内存。

全局变量(外部变量):{}外定义的变量称之为全局变量(外部变量)。作用域在整个项目,不光当前文件可用,其他文件也可以用。内存存储方式为静态存储方式,生命周期在整个应用程序。

静态局部变量:局部变量前面加上static关键字,称之为静态局部变量。它的作用域和局部变量一样,在调用函数,只不过生命周期在整个应用程序。内存存储方式为静态存储。

静态全局变量:全局变量声明前加上static关键字,称之为静态全局变量。它的作用域在当前文件,其他文件不可引用。存储方式为静态存储,生命周期在整个应用程序。

总结:

  1. 局部变量和(外部)全局变量很容易理解,作用域和生命周期不同。static关键字用在不同的变量,作用也不一样。作用在局部变量,可以改变其生命周期,延长至整个应用程序结束。如果作用在全局变量,可以改变其作用域,只限于当前文件引用,其他文件不能引用。
  2. 静态存储和动态存储:静态存储是在编译期分配内存,应用程序结束后释放内存,内存地址在静态区,由系统统一分配和释放。动态存储在运行期分配内存,调用函数结束后释放。变量内存地址在堆中,由程序员管理和释放(ARC下自动插入分配和释放代码),例如alloc分配的内存。
  3. 静态存储的变量如果在声明的时候没有初始化,会根据数据类型自动将其初始化为0或者null等。动态存储的变量如果在声明的时候没有初始化,那么它的值是不确定的,因为类型不确定,这是由动态语言决定的。

下一篇想分享下我为什么要用定义一个静态变量的方式封装AFN

局部变量,全局变量(外部变量),静态局部变量,静态全局变量相关推荐

  1. Java全局变量(成员变量)和局部变量的区别

    前言:学习变量之前若对static修饰符不理解,理解可能比较吃力. 一.下面先大致介绍java中static关键字的作用 1:为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 2:静 ...

  2. 使用了未初始化的局部变量_Java 成员变量和局部变量

    通过一个简单的 demo 我们学习下 java 中成员变量和局部变量的相关知识点. Demo 说说下面代码执行打印的结果是什么? public class MainClass {public stat ...

  3. python3 全局变量 局部变量_Python3获取变量名并修改函数内部的外部变量和局部变量,python3,在,local...

    目录 1. 获取变量名 from u_工具 import to_变量名 a = 1 print(to_变量名(a)) 2. 修改local变量 2.0. 预期效果 将变量a的值改成5 def main ...

  4. 搞懂全局变量、外部变量、静态全局变量的区别

    搞懂全局变量.外部变量.静态全局变量的区别 全局变量 外部变量 静态全局变量 全局变量 全局变量是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾. 如果外部变量不在文件的开头定义 ...

  5. static全局变量与普通全局变量区别?static局部变量与普通局部变量区别?static函数与普通函数区别?

    static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 答: 1) 全局变量(外部变量)的说明之前再冠以static 就构 ...

  6. static及静态局部变量使用精讲

    1. static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量. 全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式. ...

  7. 局部静态变量和全局静态变量

    静态变量的类型说明符是static. 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能 ...

  8. .net mysql 变量_.net 数据库 全局变量

    [全局数据库名.连接描述符] 连接描述符 网络连接目标的特殊格式的描述.连接描述符包含目标服务和网络路由信息.网络连接目标的特殊格式的描述.连接描述符包含:对于Oracle9i或Oracle8i数据库 ...

  9. 成员变量和局部变量的区别_Java 变量类型

    点击上方"蓝字"带你去看小星星 今天主要学习Java变量类型,主要是局部变量.实例变量和类变量(静态变量). Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下: ...

最新文章

  1. jQuery代码优化的9种方法
  2. Ubuntu使用ssh公钥实现免密码登录
  3. Combinations leetcode java
  4. mongodb环境安装
  5. FSF 称 DRM 被用于锁定、控制和监视用户
  6. 重邮2019计算机考研复试名单,重庆邮电大学2019年硕士研究生招生复试通知
  7. 如何在 ES5 环境下实现一个const ?
  8. cvScale 深度转换 线性变换
  9. kepware mysql_Kepware实现向数据库实时写入数据
  10. 概率论总结(《概率论与数理统计》第四版 浙江大学)
  11. 软件测评师考试大纲2018
  12. 基于PHP MYSQL的高校社团管理系统_高校社团管理系统
  13. 百度、google、高德 地图比例尺功能实现(算法地图分辨率和zoomlevel之间的关系)
  14. 查看分区表linux,通过lsblk命令查看分区表
  15. 文献阅读报告:MutiPath: Multiple Probabilistic Anchor Trajectory Hypotheses for Behavior Prediction
  16. 国际学术论文写作与发表 期末考试
  17. IOS弹出提示框(确认/取消)
  18. Hp 通过MP卡启动、关闭电源 Hp9000小型机的方式
  19. 悬剑2.0 tools安装_window安装虚拟光驱
  20. ib课程计算机科学内容,让人疑惑的ib课程体系的六大课程是指什么?

热门文章

  1. Error: Comnection activation fai led: No suitable device found for this comnect ion (device ens33 no
  2. jenkin 部署项目脚本整理
  3. 弘辽科技:淘宝收藏加购数指的是什么?有什么用?
  4. 苹果AppStore提审时的出口合规信息相关处理
  5. linux 学习 13 系统管理
  6. 各种数据库中的时间延迟技术
  7. Postman报401错误,Unauthorized以及其他接口如何填上token
  8. 【pandas之DataFrame相关函数】迭代函数iteritems(),iterrows(),itertuples()
  9. 电脑连接不上wifi(不能显示可用网络)
  10. 桥梁工程师培训-2020.1.14