自己的學習筆記。
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 }