更好地理解實例變量和類實例

要理解實例變量,得先說一下函數調用的過程。函數

函數

下面是一個簡單的代碼: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的時候,會先去建立父類的實例變量,再到子類的實例變量。多層級繼承同理。

類實例

理解了上面介紹的實例變量,我想再去理解類實例就很好理解了。

若是把類看做一個功能集合,那類的定義至關於描述類有什麼功能;使用這些功能時,須要依賴類的內部變量,那就得先建立這些變量,建立這些變量的過程稱爲類的實例化。這些變量是須要保存在內存中的,若是把這塊內存看作一個容器,那這個容器稱爲類實例。(注意:邏輯上將一個實例看作一塊內存,可是實際上,內存幾乎不多是連續的)

相關文章
相關標籤/搜索