局部变量,全局变量(外部变量),静态局部变量,静态全局变量
今天被问到了一个问题:如何让请求的类延迟释放
如果要延迟释放或者在程序整个生命周期都存在可以考虑两种方式,一是定义一个静态变量,二是用单例。用单例本质上用的是静态变量。
单例的写法如下:
+ (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关键字,称之为静态全局变量。它的作用域在当前文件,其他文件不可引用。存储方式为静态存储,生命周期在整个应用程序。
总结:
- 局部变量和(外部)全局变量很容易理解,作用域和生命周期不同。static关键字用在不同的变量,作用也不一样。作用在局部变量,可以改变其生命周期,延长至整个应用程序结束。如果作用在全局变量,可以改变其作用域,只限于当前文件引用,其他文件不能引用。
- 静态存储和动态存储:静态存储是在编译期分配内存,应用程序结束后释放内存,内存地址在静态区,由系统统一分配和释放。动态存储在运行期分配内存,调用函数结束后释放。变量内存地址在堆中,由程序员管理和释放(ARC下自动插入分配和释放代码),例如alloc分配的内存。
- 静态存储的变量如果在声明的时候没有初始化,会根据数据类型自动将其初始化为0或者null等。动态存储的变量如果在声明的时候没有初始化,那么它的值是不确定的,因为类型不确定,这是由动态语言决定的。
下一篇想分享下我为什么要用定义一个静态变量的方式封装AFN
局部变量,全局变量(外部变量),静态局部变量,静态全局变量相关推荐
- Java全局变量(成员变量)和局部变量的区别
前言:学习变量之前若对static修饰符不理解,理解可能比较吃力. 一.下面先大致介绍java中static关键字的作用 1:为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 2:静 ...
- 使用了未初始化的局部变量_Java 成员变量和局部变量
通过一个简单的 demo 我们学习下 java 中成员变量和局部变量的相关知识点. Demo 说说下面代码执行打印的结果是什么? public class MainClass {public stat ...
- python3 全局变量 局部变量_Python3获取变量名并修改函数内部的外部变量和局部变量,python3,在,local...
目录 1. 获取变量名 from u_工具 import to_变量名 a = 1 print(to_变量名(a)) 2. 修改local变量 2.0. 预期效果 将变量a的值改成5 def main ...
- 搞懂全局变量、外部变量、静态全局变量的区别
搞懂全局变量.外部变量.静态全局变量的区别 全局变量 外部变量 静态全局变量 全局变量 全局变量是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾. 如果外部变量不在文件的开头定义 ...
- static全局变量与普通全局变量区别?static局部变量与普通局部变量区别?static函数与普通函数区别?
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 答: 1) 全局变量(外部变量)的说明之前再冠以static 就构 ...
- static及静态局部变量使用精讲
1. static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量. 全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式. ...
- 局部静态变量和全局静态变量
静态变量的类型说明符是static. 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能 ...
- .net mysql 变量_.net 数据库 全局变量
[全局数据库名.连接描述符] 连接描述符 网络连接目标的特殊格式的描述.连接描述符包含目标服务和网络路由信息.网络连接目标的特殊格式的描述.连接描述符包含:对于Oracle9i或Oracle8i数据库 ...
- 成员变量和局部变量的区别_Java 变量类型
点击上方"蓝字"带你去看小星星 今天主要学习Java变量类型,主要是局部变量.实例变量和类变量(静态变量). Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下: ...
最新文章
- jQuery代码优化的9种方法
- Ubuntu使用ssh公钥实现免密码登录
- Combinations leetcode java
- mongodb环境安装
- FSF 称 DRM 被用于锁定、控制和监视用户
- 重邮2019计算机考研复试名单,重庆邮电大学2019年硕士研究生招生复试通知
- 如何在 ES5 环境下实现一个const ?
- cvScale 深度转换 线性变换
- kepware mysql_Kepware实现向数据库实时写入数据
- 概率论总结(《概率论与数理统计》第四版 浙江大学)
- 软件测评师考试大纲2018
- 基于PHP MYSQL的高校社团管理系统_高校社团管理系统
- 百度、google、高德 地图比例尺功能实现(算法地图分辨率和zoomlevel之间的关系)
- 查看分区表linux,通过lsblk命令查看分区表
- 文献阅读报告:MutiPath: Multiple Probabilistic Anchor Trajectory Hypotheses for Behavior Prediction
- 国际学术论文写作与发表 期末考试
- IOS弹出提示框(确认/取消)
- Hp 通过MP卡启动、关闭电源 Hp9000小型机的方式
- 悬剑2.0 tools安装_window安装虚拟光驱
- ib课程计算机科学内容,让人疑惑的ib课程体系的六大课程是指什么?
热门文章
- Error: Comnection activation fai led: No suitable device found for this comnect ion (device ens33 no
- jenkin 部署项目脚本整理
- 弘辽科技:淘宝收藏加购数指的是什么?有什么用?
- 苹果AppStore提审时的出口合规信息相关处理
- linux 学习 13 系统管理
- 各种数据库中的时间延迟技术
- Postman报401错误,Unauthorized以及其他接口如何填上token
- 【pandas之DataFrame相关函数】迭代函数iteritems(),iterrows(),itertuples()
- 电脑连接不上wifi(不能显示可用网络)
- 桥梁工程师培训-2020.1.14