iOS 局部变量,全局变量,static,const,exter
ios中的成员变量和属性
@interface Person : NSObject
{
NSString *_sex;
}
@property (nonatomic, copy) NSString *name;
@end
定义一个Person类,在类里面分别定义了一个成员变量_sex和属性name。
成员变量:
- 成员变量的默认修饰是@protected。
- 成员变量不会自动生成set和get方法,需要自己手动实现。
- 成员变量不能用点语法调用,因为没有set和get方法,只能使用->调用。
属性
- 属性的默认修饰是@protected。
- 属性会自动生成set和get方法。
- 属性用点语法调用,点语法实际上调用的是set和get方法。
1.局部变量
普通局部变量
普通局部变量:在函数/方法/代码块内声明的变量。变量 存储在栈区(stack),它的生命周期、作用域都是在这个代码块内。一旦出了这个代码块,存储局部变量的这个栈内存就会被回收,局部变量也就被销毁。
静态局部变量(用static修饰局部变量)
静态局部变量,和全局变量,静态全局变量一样,是存储在‘静态存储区’。该局部变量只初始化一次,在内存中的地址不变,静态局部变量的生命周期是整个源程序,但作用域是声明它的代码块内。退出该函数后,尽管该变量还继续存在,但不能使用它。
2.全局变量
1. 全局变量
其存储在静态存储区,直到程序结束才销毁。也就是其作用域是整个源程序。
- 我们可以使用extern关键字来引用某个全局变量,不需要导入.h文件也能直接使用。如 extern NSString *rAPPName;
- 将全局变量使用extern 关键字 在.h文件中声明,并在.m文件中实现赋值,使用时导入.h文件就能直接使用.
2. 静态全局变量
在局部变量的说明前再加上static说明符就构成静态局部变量
其生命周期没有变,依旧是在程序结束时才销毁。但是其作用域变了。现在只限于申明它的这个文件才可见。
使用extern关键字无法引用这个全局变量。
static修饰的变量必须放在@implementation外面或方法中,它只在程序启动初始化一次。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围
const
const修饰的是其右边的值,也就是const右边的这个整体的值不能改变。
1. 修饰基本数据类型,可以将其变为一个常量,无法修改
int const a = 1;
const int b = 2;
a = 3; //Xcode提示错误,无法修改a的值
b = 3; //Cannot assign to variable 'a' with const-qualified type 'const int'
2. 修饰指针类型
1. const在指针符号的右边
int a = 1;
int b = 2;
int *const p = &a;
*p = 30;
p = &b; //Xcode提示错误,无法修改
指针指向的地址无法改变,但是可以通过指针改变指向地址说保存的值。
2. const在指针符号的左边
int a = 1;
int b = 2;
int const *p = &a;
*p = 30; //Xcode提示错误,无法修改
p = &b;
指针指向的地址可以改变,但是无法通过指针改变指向地址说保存的值。(int const *p和const int *p效果一致)
3. const同时在指针符号两边
int a = 1;
int b = 2;
int const * const p = &a;
*p = 30; //Xcode提示错误,无法修改
p = &b; //Xcode提示错误,无法修改
指针指向的地址不可以改变,同时无法通过指针改变指向地址说保存的值。
NSString *const str1 = @"str1";
// str1 = @"str1***str1";//报错:
常量指针不可以指向其他的内存,不可以修改常量指针指向的原内存中的内容
NSString const *str2 = @"str2";
str2 = @"str2***str2";
常量指针可以指向其他的内存,不可以修改常量指针指向的原内存中的内容
NSMutableString const *var1 = [@"str" mutableCopy];
[var1 appendString:@"__var"];//改变内存中的内容
var1 = [@"123" mutableCopy];//var1指向新的内存
常量指针可以指向其他的内存,可以修改常量指针指向的原内存中的内容
SMutableString *const var2 = [@"str" mutableCopy];
[var2 appendString:@"__var"];//改变内存中的内容
var2 = [@"123" mutableCopy];//var2不能指向新的内存,报错:
常量指针不可以指向其他的内存,可以修改常量指针指向的原内存中的内容
extern
extern定义的全局常量的用法和宏定义类似,但是还是有本质上的不同的。 extern定义的全局常量更不容易在程序中被无意窜改。
static const NSTimeInterval kTimer = 0.3; //推荐
#define KTIMER 0.3 //不推荐
extern只能声明,不能用于实现。即不能 extern NSString * rTestStatic = @"dd";
https://www.jianshu.com/p/a36286973c85
https://www.jianshu.com/p/aec2e85b9e84
https://www.jianshu.com/p/1e7ffc4c274b
https://www.jianshu.com/p/d4fad966e1b5