2010-01-18 116 views
0

我知道類初始化時,類變量是在內存中聲明的(而不是在棧中),我知道如何基本使用類方法。但是我有一些關於在基本文檔中沒有回答的類方法的問題。關於objective-c類方法的問題

類方法是否也在內存中聲明?那麼在這些類方法中聲明的任何對象呢?它們在範圍內是「靜態的」嗎?那麼作爲參數傳入一個類方法的對象呢?這些也是'靜態'嗎?

是否重複調用一個類的方法意味着聲明中它被一次又一次地(每一個方法調用)分配的所有對象,或者他們生活在一個內存位置?每次運行都會被清除嗎?

例如,會發生什麼情況do_something方法在這裏:

+ (void) main 
{ 
    while (i < MAX) 
    { 
     [MyClass do_something]; 
    } 
} 

+ (void) do_something 
{ 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    ... 
    [array release]; 
} 
+0

調用堆棧在內存中。 「在記憶中聲明」是什麼意思? – outis 2010-01-18 09:39:01

回答

1

類方法遵循相同的規則,除了你的對象(實例)方法不能從類方法訪問實例變量,顯然是因爲高德得到每分配對象實例。

在您的示例中,「數組」與每個調用一樣都在堆上分配。

+0

因此,在堆上多次分配「數組」對性能來說顯然是不利的,而不是如果它是對象方法,對吧? 謝謝。 – 2010-01-18 09:51:11

+0

它是一個類或實例方法並不重要,分配規則是相同的。 + alloc發送+ allocWithZone:,然後調用malloc()的變體。你可以聲明你的數組是靜態的,並在創建它之前對其進行測試,這將爲你節省分配時間。但是你不需要靜態對象,除非你需要它們或者不得不優化你的代碼。首先對您的應用程序進行配置,並且只有在瓶頸時才進行這種優化。 – Costique 2010-01-18 10:31:37

0

當調用+(void) do_something方法array對象將被初始化,爲您的代碼指定,每一次。它只是被宣佈爲該方法的範圍。

您可以在類作用域中聲明靜態變量。這些,正如你所期望的,可以被所有的實例和類(又名靜態)方法訪問。

參見:http://www.otierney.net/objective-c.html#class

1

所有變量都存儲「存儲器」,不管它們的存儲類型(靜態,自動的,自由存儲區),位置(堆棧或堆),鍵或範圍。只有聲明爲靜態時,變量纔是靜態的。否則,類方法中的變量,無論是參數還是局部變量,都具有函數或局部範圍,自動存儲,無鏈接並存儲在堆棧中。

類方法具有全局範圍內外聯動,雖然你可以發送郵件到一個對象(包括類)即使不在範圍內的處理程序。內部聯繫應該是可能的,但我不認爲這種語言支持聲明具有內部聯繫的方法。存儲類型和位置並不適用於方法,但可以說方法具有靜態存儲。