OC中的语言变量,按作用域可分为两种:局部变量和全局变量。
局部变量:也称为内部变量,局部变量是在方法内部声明的。其作用域仅限于方法内,离开该方法再使用这个变量就是非法的。
全局变量:也称为外部变量,它是方法外部定义的变量。它不属于哪一个方法,而属于一个源程序文件,其作用域是整个源程序。全局变量的说明符为:extern ,比如:extern int intX;
如果一个源文件中的外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,而不起作用。通常尽量不使用 extern 变量。
在类中的实例变量,是可以在各个方法内使用。在这些实例变量上,你可以设置访问控制。
下面举例来说明局部变量和实例变量的区别:
1 #import <Foundation/Foundation.h> 2 3 @interface Test : NSObject{ 4 int _x; // 实例变量 5 int _y; 6 } 7 8 - (void)setX:(int)x; 9 - (int)x; 10 11 - (void)setY:(int)y; 12 - (int)y; 13 14 - (void)print; 15 16 @end 17 18 @implementation Test 19 20 - (void)setX:(int)x{ 21 _x = x; 22 } 23 - (int)x{ 24 return _x; 25 } 26 27 28 - (void)setY:(int)y{ 29 _y = y; 30 } 31 - (int)y{ 32 return _y; 33 } 34 35 - (void)print{ 36 int i = 1; // 局部变量 37 NSLog(@"i = %i",i); 38 NSLog(@"相加的结果:%i",_x + _y); 39 } 40 41 42 @end 43 44 int main(int argc , const char * argv[]){ 45 @autoreleasepool { 46 Test *test = [[Test alloc] init]; 47 [test setX:10]; 48 [test setY:10]; 49 NSLog(@"x = %i , y = %i",[test x],[test y]); 50 [test print]; 51 } 52 return 0; 53 }
理解 static 变量:
被 static 修饰的变量称为静态变量。静态变量有以下优点:可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态变量只存储一处,供所有对象共用。静态变量的值对每个对象都一样,但它的值是可以更新的。只要某一个对象对静态变量的值更新一次,所有对象都能访问更新后的值,这样可以提高效率。下面通过代码来演示它的用法:
1 #import <Foundation/Foundation.h> 2 3 @interface Test : NSObject{ 4 5 } 6 - (int)staticIntY; 7 @end 8 9 @implementation Test 10 11 static int Y = 10; 12 13 - (int)staticIntY{ 14 Y+=1; 15 return Y; 16 } 17 18 @end 19 20 int main(int argc , const char *argv[]){ 21 @autoreleasepool { 22 Test *test = [Test new]; 23 NSLog(@"Y = %i",[test staticIntY]); // Y = 11; 24 NSLog(@"Y = %i",[test staticIntY]); // Y = 12; 25 26 } 27 return 0; 28 }
变量的存储类别:
前面已经使用了一些变量存储类别的说明符,例如 extern 和 static,下面将介绍另外三个变量存储类别的说明符:
1. auto 用于声明一个自动全局变量,是方法内部变量的声明方式,一般省略它,比如:auto int x = int x;
注意:自动变量没有默认的初始值,除非我们显示的给它赋值,否则它的值不是确定的。
2. const 可声明程序中的值为不可改变的值,它会告诉编译器,这个变量在程序的运行期间都有恒定的值。是一个常数,例如:const double pi = 3.14;
3. volatile 这个修饰符和 const 修饰符相反,它告诉编译器,该变量的值会发生改变。例如:
*char1 = 'a';
*char1 = 'b';
如果没有使用 volatile ,那么,当编译器遇到这两行代码的时候,因为这是对一个地址进行两次连续的赋值,所以编译器就将第一个语句从程序中删除掉。为了防止这种情况出现。应该把 char1 声明为一个 volatile 变量;
volatile char *char1;
下面通过一个例子来演示一下这三个标识符的用法:
1 #import <Foundation/Foundation.h> 2 3 @interface Test : NSObject{ 4 5 } 6 7 - (void)print; 8 @end 9 10 @implementation Test 11 12 const double d = 3.14; // 表示d是不会改变的 13 14 volatile char c = 'c'; // 表示c是随时都可变的 15 16 - (void)print{ 17 auto int i = 10; // 局部变量 18 NSLog(@"i = %i",i); 19 NSLog(@"d = %f",d); 20 NSLog(@"c = %c",c); 21 } 22 23 @end 24 25 int main(int argc , const char *argv[]){ 26 @autoreleasepool { 27 Test *test = [Test new]; 28 [test print]; 29 } 30 return 0; 31 }