1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 局部变量 全局变量(外部变量) 静态局部变量 静态全局变量

局部变量 全局变量(外部变量) 静态局部变量 静态全局变量

时间:2018-10-06 22:43:04

相关推荐

局部变量 全局变量(外部变量) 静态局部变量 静态全局变量

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

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

单例的写法如下:

+ (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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。