要理解實例變量,得先說一下函數
調用的過程。函數
下面是一個簡單的代碼:atom
void function(int a) { printf("%d", a); } int A = 5; function(A);
function()
的定義中,變量a
是一個形參,調用時的那個變量A
稱爲實參。
函數的定義中那個變量a
實際上在內存中是不存在的
!
問題來了,變量a
若是不存在的話,函數怎麼正常執行呢?code
咱們調用函數的過程是這樣的:
咱們建立了變量A
(內存中真實存在的
變量),調用函數的時候,會先在內存中建立一個A
的副本A"
,A"
會真實的佔用
內存!A"
會被傳入函數中充當a
的位置。這樣函數才能夠被正常運行!
因此,每次調用函數時,都會產生不一樣的A"
(這裏A"
指的是你傳入參數的副本)。繼承
先看一個簡單的object-c
類定義,了一個屬性value
。內存
@interface TestObject : NSObject { int _value; } @property (assign, nonatomic) int value; @end @implementation TestObject - (int)value { return _value; } - (void)setValue:(int)newValue { _value = newValue; } @end
根據實例變量的定義_value
就是一個實例變量。那爲何它會被稱爲實例變量呢?it
這個類的定義中變量_value
是不存在內存中的!至關於上面函數定義裏面的形參
。io
調用下面代碼:function
TestObject * object = [[TestObject alloc] init];
運行上面那行代碼,你應該能看懂,建立了一個TestObject
類實例。容器
咱們都知道,須要有類實例才能對類進行操做,而同一個類能夠有無限多個實例。
變量
那實例建立的過程是怎樣的呢?
內部的過程大體是這樣的:
調用了一個工廠方法alloc
,實例方法init
(這裏不討論)。
其中最關鍵的地方在於alloc
的調用,它被調用時,建立了變量_value
。
剛剛建立的_value
至關於上面介紹的,調用函數
時的A"
。而類定義中的_value
至關於 形參a
。
剛剛建立的_value
就是類的變量的實例(真實存在內存中)。
若是你還惦記着上面「忘掉」的繼承
:
其實也不復雜,在調用alloc
的時候,會先去建立父類的實例變量,再到子類的實例變量。多層級繼承同理。
理解了上面介紹的實例變量,我想再去理解類實例就很好理解了。
若是把類看做一個功能集合,那類的定義
至關於描述類有什麼功能;使用這些功能時,須要依賴類的內部變量,那就得先建立這些變量,建立這些變量的過程稱爲類的實例化
。這些變量是須要保存在內存中的,若是把這塊內存看作一個容器,那這個容器稱爲類實例
。(注意:邏輯上將一個實例看作一塊內存,可是實際上,內存幾乎不多是連續的)