美文网首页
基础:iOS 中static和extren的使用

基础:iOS 中static和extren的使用

作者: 喔牛慢慢爬 | 来源:发表于2021-03-17 23:18 被阅读0次

    前言

    我们在日常开发中经常会用到常量定义、静态变量、静态全局变量的使用,这时就会使用到static、extern和const关键字,在这里简单的记录下static和extern这两个关键字的使用。

    static

    static影响变量的生命周期和变量的作用域。static的使用分为两种情况:1、修饰局部变量;2、修饰全局变量;使用static修饰的变量只会初始化一次, 并在内存中分配在静态存储区,变量在整个程序执行期间不释放,其所分配的空间始终存在;

    • 修饰局部变量:
    1. 在函数、方法、代码块内声明的变量;
    2. 使局部变量只初始化一次;
    3. 局部变量的作用域未改变,但生命周期改变了,生命周期是整个源程序,作用域是声明它的代码块内;
    4. 局部变量本来存储在栈区,一旦出了这个代码块,存储局部变量的这个栈内存就会被回收,局部变量也就被销毁。使用static修饰后变量存储在静态存储区;
    - (IBAction)tapEvent:(id)sender {
        //定义一个局部静态变量
        static int i=0;
        //每次点击都+1
        i ++;
        NSLog(@"i=%d",i);
    }
    //输出结果
    2021-03-18 10:15:57.971470+0800 WYHStaticExternDemo[6812:4572201] i=1
    2021-03-18 10:15:58.270829+0800 WYHStaticExternDemo[6812:4572201] i=2
    2021-03-18 10:15:58.428740+0800 WYHStaticExternDemo[6812:4572201] i=3
    
    • 修饰全局变量:
    1. 不会修改全局变量的生命周期,其存储在静态存储区,直到程序结束才销毁;
    2. 会修改全局变量的作用域,变量的作用域只限于声明它的本文件访问使用;
    3. 避免重复定义全局变量;

    注意:1、当静态全局变量声明在.h头文件时,其他类引用静态全局变量所在类头文件后可以访问。2、初始化的全局变量和静态变量存放在一块区域(数据段),未初始化的全局变量和静态变量存放在一块区域(BSS段)

    • 修饰函数/方法

    被修饰的函数或方法称为静态函数,使外部文件无法访问这个函数,仅本文件可以访问。在OC中很少使用。

    extern

    extern翻译是"外部的",用来引用全局变量,用来获取全局变量(包括全局静态变量)的值,不能用于定义变量,当使用全局变量时首先会在当前文件中查找,如果没有查找到会再到其他文件中查找变量,在多个文件中定义相同名称的全局变量会报处重复定义的错误。

    注:声明可以多次,定义只能一次

    • 使用方式1:定义的时候不使用extern修饰,在使用的时候通过extern声明,调用全局变量。
      A方法:
    #import <Foundation/Foundation.h>
    @interface Person : NSObject
    @end
    
    #import "Person.h"
    NSString *name = @"Tom";
    @implementation Person
    
    @end
    

    B方法.m:

    #import <Foundation/Foundation.h>
    @interface School : NSObject
    @end
    
    #import "School.h"
    @implementation School
    extern NSString *name;
    NSLog(@"%@", name);
    @end
    
    • 使用方式2:在A类的.h头文件使用extern声明全局变量,在A类的.m中初始化全剧变量的值,在B类中导入A类后可以直接访问全局变量
    #import <Foundation/Foundation.h>
    
    extern NSString *name;
    @interface Person : NSObject
    
    @end
    
    #import "Person.h"
    
    NSString *name = @"Tom";
    
    @implementation Person
    
    @end
    

    相关文章

      网友评论

          本文标题:基础:iOS 中static和extren的使用

          本文链接:https://www.haomeiwen.com/subject/mqksfltx.html