2011-01-13 39 views
20

我已經閱讀了幾次「靜態」,包括髮布這個問題之前。 我仍然在尋找一個「啊哈」。爲什麼在UITableViewCell標識符中使用static關鍵字?

在我看過的每一段代碼中,在UITableView的靜態環境中出現在單元標識符中。例如在最近的CellForRowAtIndexPath中:

static NSString *defaultIndentifier = @"Managed Object Cell Identifier"; 

我的問題是爲什麼我們需要和使用「靜態」?

回答

11

因此它只會構造一次。如果它不是靜態的,每次發送消息時都會發送一個(這是很多)

+0

如果通過「每次都創建一個」,你的意思是「將一個常量指針推入堆棧變量」,當然。但是,它和'int i = 3;'一樣昂貴,因爲編譯器已經將'@「標識符」'編譯成常量。唯一的一次靜態實際上是一個好處是如果字符串是在運行時而不是使用常量字符串構造的。 –

+1

這仍然是一個好處。每次運行該方法時都會削減兩個處理器週期(可能會很多次)。 – ughoavgfhw

+0

@ughoavgfhw是的,但它不會讓你的二進制文件更大,並讓你的應用程序使用更多的內存? – ma11hew28

18

這裏沒有真正的好處。這對讀者來說只是一個提示,即在這段代碼中的所有單元格都使用相同的值。由於標識符本身是一個常量字符串,因此它被編譯成一個不可變的內存塊,並且每次被引用爲相同的指針,例如,即使刪除關鍵字static,構建字符串也不會涉及成本。

+0

關於「標識符本身是一個常量字符串」 – Philip007

0

我的猜測是,通過聲明該字符串爲靜態,每次它被傳入-dequeueReusableCellWithIdentifier:CellIdentifierforIndexPath:時,每次都使用相同的指針(因爲靜態聲明的變量只在堆上分配一次,在程序執行的早期)

[NSString -isEqualToString:]最有可能實現首先執行指針比較,然後是字符明智的比較作爲後備,我認爲可以削減每次迭代幾個週期。 (a)表格單元重新填充在通常非常小的一組單元上操作,並且已經很好地優化,以及(b)表格刷新是突發的 - 它發生一次並且那麼直到用戶滾動或應用程序邏輯更改內容時纔會再次發生 - 如果最終每秒調用-reloadTable 100次,那麼顯然應用程序邏輯有問題。

我懷疑靜態關鍵字是一個退化的遺留約定 - 也許早在今天,蘋果公司對指針進行了散列,而不是執行適當的字符串比較。