美文网首页
1. const、static、extern、define区别

1. const、static、extern、define区别

作者: 苏宇lovecc | 来源:发表于2016-06-01 16:26 被阅读78次

    一. const与define的区别

    1)执行时刻:宏是预编译(编译之前处理),const是编译阶段。
    2)编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。
    3)宏可以定义一些函数,方法。 const不能。
    (这里需要证实一点,宏不会开辟新的内存空间 ,而是存放在常量区,也就是正常使用并不会造成内存暴涨 ).

    推荐使用const,而不是define。

    二. const使用

    全局常量:一处定义常量,全局可以使用。
    例如:在ViewController.m中定义一个全局常量:

    const NSString *cc = @"cc123";
    

    在AppDelegate.m中可以访问:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
       
        extern NSString *cc;
        NSLog(@"%@",cc);
    
        return YES;
    }
    

    终端显示:


    const.png

    三. extern 使用

    在上面我们就看到了,如果你要访问别的文件中定义的全局常量,就需要用到extern关键词了。

    四. static使用

    4.1 基础
    static修饰的变量叫做 静态变量 。它被储存在全局区(或者叫静态区) ,该区域的变量在编译时即被分配内存,并且在app运行期间一直存在内存当中,直到app停止运行。所以被static修饰的变量在内存中只存有一份,并且在整个app运行期只被初始化一次。它的生命周期与应用程序是一样的。
    从面向对象的角度出发,当需要一个数据对象为整类而非某个对象服务,同时又要求此变量隐藏在类的内部的时候,就可以使用static。
    4.2 优点:
    1)节省内存,静态变量只存储一处(全局区,也叫静态区),但供所有对象使用。
    2)它的值是可以更新的(声明后的static变量在其他类中是不能通过类名直接访问的,但是可以通过这个对象的方法间接修改这个静态变量的值)。
    3)可提高时间效率,只要某个对象对静态变量更新一次,所有的对象都能访问更新后的值。
    4.3 作用
    1)隐藏性:只能在本类的.m文件中使用,它的作用域只是在声明的这个.m文件中 。声明后的static静态变量在其他类中是不能通过类名直接访问的,但是可以通过调用这个类的方法间接修改这个静态变量的值(单例模式)。
    2)持久性:static标记的变量会存储到全局区(静态区),生命周期和程序相同。只在声明的类中可见,在声明的类中结束后,再次使用还是之前的值。
    4.4 总结
    局部变量和局部静态变量的区别在于它的生命周期。全局变量和全局静态变量的区别在于作用域。变量和静态变量的不同之处在于后者的内存只被分配一次。
    开发使用场景:在一个文件中经常使用的只读字符串常量,可以使用static与const组合。
    需要注意的是: 静态变量需要酌情使用,滥用会导致占用过多内存。
    附:无论是.h或.m文件中,static 写在interface外面编译是没有错误的,但写在interface里面会直接报错。

    //example.m
    #import "example.h"
    static int count = 10;
    @implementation Example
    +(int)count{
        return count;
    }
    @end
    

    上面的例子中可以通过[Example count]对静态变量count进行访问,无须创建实例。

    五. 参考资料:

    1. iOS 宏和常量的正确使用
    2. iOS - static、const、extern总结
    3. iOS程序中的内存分配 栈区堆区全局区
    4. iOS-详细解读const

    相关文章

      网友评论

          本文标题:1. const、static、extern、define区别

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