const的作用:
1.const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)。
2.被const修饰的变量是只读的。
static的作用:
-
修饰局部变量:
1.延长局部变量的生命周期,程序结束才会销毁。
2.局部变量只会生成一份内存,只会初始化一次。
3.改变局部变量的作用域。 -
修饰全局变量
1.只能在本文件中访问,修改全局变量的作用域,生命周期不会改
2.避免重复定义全局变量
3..pch生成的全局变量是每个文件一份,所以修改所在文件的全局变量并不能跨文件修改
extern的作用
只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量
extern工作原理:先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。
重点
- .h不加 external
.h中
.m中#import<UIKit/UIKit.h> NSString* const myTest;
如果不在.h中加extern,去引用.h中的变量时,因为.h和.m同时声明一个变量时,虽然写的时候不报错,但是在代码编译的时候会报错(这也说明.m文件不管有没有引用都会编译并链接),错误如下:#import<UIKit/UIKit.h> NSString * const myTest = @".m";
所以extern是必要的,表明.h中的全局变量引用自其他文件,我们要在.h中加上extern.h中1 duplicate symbol for architecture x86_64
#import<UIKit/UIKit.h> extern NSString* const myTest;
- const 修饰范围
#import <Foundation/Foundation.h> static NSString * const testString = @"testString"; FOUNDATION_EXTERN NSString * const testStringExternal;
这样的才是不可以使用的时候修改的,修改的时候会报一下错误:#import "MacroOC.h" NSString * const testStringExternal = @"testStringExternal";
testString = @"123";
如果将 const 放在*前面是指针不变,里面的内容是可以改变的Cannot assign to variable 'testString' with const-qualified type 'NSString *const __strong'
static NSString const * testString = @"testString";
系统OC 自带的写法也是写在*之后的2017-01-06 16:43:46.623 OC2SwiftDemo[1891:166514] testString 2017-01-06 16:43:46.624 OC2SwiftDemo[1891:166514] 修改后 2017-01-06 16:43:46.624 OC2SwiftDemo[1891:166514] 123
-全局变量的作用域UIKIT_EXTERN NSString *const UIKeyboardFrameBeginUserInfoKey NS_AVAILABLE_IOS(3_2) __TVOS_PROHIBITED; // NSValue of CGRect UIKIT_EXTERN NSString *const UIKeyboardFrameEndUserInfoKey NS_AVAILABLE_IOS(3_2) __TVOS_PROHIBITED; // NSValue of CGRect UIKIT_EXTERN NSString *const UIKeyboardAnimationDurationUserInfoKey NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED; // NSNumber of double UIKIT_EXTERN NSString *const UIKeyboardAnimationCurveUserInfoKey NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED; // NSNumber of NSUInteger (UIViewAnimationCurve) UIKIT_EXTERN NSString *const UIKeyboardIsLocalUserInfoKey NS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED; // NSNumber of BOOL
1.定义的全局变量作用范围是当前的类,其他类可以定义重名的全局变量;
2.swift 定义一个全局变量,由于命名空间原因,其他文件是不可以再定义的,再定义会报重定义
3.OC 中如果使用 import ,类中和 import 类中定义同名的全局变量会报重定义 - 参考文档