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

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

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

单例的写法如下:

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

猜你喜欢

转载自blog.csdn.net/oik_ios/article/details/79626377