Objective-c 中的變數,Objective-c變數
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 @end17 18 @implementation Test19 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 @end43 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 Test10 11 static int Y = 10;12 13 - (int)staticIntY{14 Y+=1;15 return Y;16 }17 18 @end19 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 Test11 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 @end24 25 int main(int argc , const char *argv[]){26 @autoreleasepool {27 Test *test = [Test new];28 [test print];29 }30 return 0;31 }