1> const int age1 = 21;
age1 = 100; // 编译报错
2> int const age2 = 22;
3> const int *age3 = 23;
int val1 = 101;
*age3 = val1; // 编译报错
age3 = &val1; // 编译通过
4> int const *age4 = 24;
5> int * const age5 = 25;
int val2 = 102;
age5 = &val2; // 编译报错
*age5 = val2; // 编译通过
解释:
1> const放在最前面可以往后移一位,含义不变,int const age1 = 21, const修饰age1,意味着age1不可修改
2> 同1
3> 和1一样,往后移一位,含义不变,int const *age3 = 23, const修饰 *age3,
首先age3是一个指针变量, *age3是取得指针所指向的变量, const修饰*age3, 意味着 *age3是取得指针所指向的变量 不可修改
4> 同3
5> age5是指针变量, const修饰指针变量,意味着 这个指针变量 不可修改,而指针变量存的是地址,意思就是不能把 这个指针变量存的地址 改成 其他地址.或者说不能改变指针的指向.
2. 项目中,经常有一些固定的值,可能会被多个地方使用,这个时候可以考虑用const
比如下面这样:
NSString * const myURL = @"http://xxx.xxx.xxx.xxx:8090";
其实也可以用宏,比如下面这样:
#define myURL @"http://xxx.xxx.xxx.xxx:8090"
但是用const比宏效率更高,比如下面这种打印多次,如果用宏,本质上是在编译时做替换,会占用3份内存,如果用const则不会浪费内存,始终是1份内存
NSLog(@"远程连接的地址是 %@",myURL);
NSLog(@"远程连接的地址是 %@",myURL);
NSLog(@"远程连接的地址是 %@",myURL);
3. 使用const必须注意的地方
如果多个.m文件需要用到myURL,可以在每一个.m文件都像下面这样初始化吗?
NSString * const myURL = @"http://xxx.xxx.xxx.xxx:8090";
肯定不行,编译时,会报重复定义.比如在pch文件中写上面这行代码,就相当于为每一个.m文件都写这行代码
要解决重复定义的问题,可以参照苹果的做法,比如系统预置的通知
UIKIT_EXTERN NSString *const UIKeyboardWillShowNotification;
UIKIT_EXTERN NSString *const UIKeyboardDidShowNotification;
UIKIT_EXTERN NSString *const UIKeyboardWillHideNotification;
UIKIT_EXTERN NSString *const UIKeyboardDidHideNotification; // UIKIT_EXTERN,是经过处理的extern
(PS:其实也可以用static修饰全局变量,表明该全局变量只对当前文件可见,但是不建议这么做,每个.m文件都这么做,比较浪费内存)
具体解决方法:
1>自定义类MYConst,继承自NSObject
2>在MYConst.m文件中
#import <Foundation/Foundation.h>
NSString * const myURL = @"http://xxx.xxx.xxx.xxx:8090";
3>在MYConst.h文件中
#import <Foundation/Foundation.h>
extern NSString * const myURL; // extern,外部的意思,表明这个全局变量,不是自己的,是别人的,请在其他文件里找这个全局变量
4> 在pch文件中 #import "MYConst.h",这样项目里每一个.m文件都有 extern NSString * const myURL;