免费开源的iOS开发学习平台

OC变量Variable:4-const关键字

1、const介绍

如果不想让某些变量的值改变,可以使用const关键字来修饰这些变量。如果添加const关键字,这些变量的值从头到尾都不会改变了。在iOS开发中,经常把字符串常量添加const关键字,从而替代宏(#define),因为const的执行性能要比宏定义要高。给变量添加const关键字,主要目的是为了防止定义的对象被修改。在定义有const关键字的对象时,要设置初始值。

在iOS开发中,有关const最常用的就是用来修饰NSString类型的字符串常量,这种使用方法在苹果提供的系统框架中随处可见。如下:

UIKIT_EXTERN NSString *const UIViewControllerHierarchyInconsistencyException;
UIKIT_EXTERN NSString *const UIViewControllerShowDetailTargetDidChangeNotification;

对于const的使用,只要掌握一条原则即可,即:const用来修饰离其最近的变量

如下面的代码所示:

  • 当const修饰的是*x时,即指向字符串对象的指针指向是不能改变的,但是字符串的内容是可以改变的;

  • 当const修饰的是y时,即指向的字符串内容@”九九学院”是不能改变的,但是指针指向的地址是可以改变的。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //const修饰的是指针变量*x
        NSString const *x = @"www.99ios.com";
        x = @"九九学院";  //指针指向的内存空间中保存的字符串内容可以改变
        //const修饰的是字符串
        NSString * const y = @"九九学院";
        /*不能修改
         y = @"www.99ios.com";
         */
        NSLog(@"x = %@",x);
        NSLog(@"y = %@",y);
    }
    return 0;
}

运行结果如下。被const修饰的指针变量*x不能改变,但该指针指向的存储内容可以被改变,同理,被const修饰的y,即存储了字符串的内存空间不能被修改,当修改时编译器会报错。

2、const使用方法

在实际的iOS开发中,const最常用于定义字符串常量,并且为了维护方便,会把工程中所有的字符串常量都统一放在一个const类中。具体的实现方法如下:

  • 新建一个MYConst类,在MYConst.h文件中,声明所有的常量,需要注意一点:每个常量前面都加上extern关键字,否则在编译时会报声明重复错误。如下所示:
#import <Foundation/Foundation.h>
/**高度*/
extern int const height;
/**启动成功通知*/
extern NSString * const launchSuccessNotification;
  • 在MYConst.m文件中,为每个常量赋值。如下所示:
#import "MYConst.h"
int const height = 44;
NSString * const launchSuccessNotification = @"launchSuccessNotification";
  • 当需要使用const修饰的常量时,引入MyConst类即可。如下所示:
#import <Foundation/Foundation.h>
#import "MYConst.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        /*const使用*/
        NSLog(@"my const height:%d",height);
        NSLog(@"my const notification string: %@",launchSuccessNotification);
    }
    return 0;
}

运行结果:

3、const与宏#define的区别

在开发过程中,如果涉及到字符串常量的定义,建议都用const,其处理性能比宏定义要高。当多次使用该常量时,只要在内存中创建一个对象即可。当使用宏#define来定义字符串常量时,在程序编译的过程中,所有使用到宏的地方都会使用设置的字符串来替换,因此当程序运行时,会创建多个对象,占用多个内存区域,执行效率低一些。

对于const和宏的使用,只要把握一个要点即可:凡是涉及到常量的定义都建议用const,并且所有使用const修饰的常量都统一放在一个类中,其他的都可以使用宏来定义。

示例代码

https://github.com/99ios/3.5.4