2013-03-12 60 views
10

我總是看到樣板爲UITableViewController爲CellIdentifier使用靜態NSString的優勢是什麼?

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 

聲明

static NSString *CellIdentifier 

爲什麼靜態的?我在很多地方改變了這個,因爲我的CellIdentifier基於該部分而改變?這背後的推理是靜態的嗎?我是否影響表現?

回答

21

cellForRowAtIndexPath:被稱爲很多。任何時候,如果有一個方法在短時間內被反覆調用,您希望最小化等待自動釋放的對象的數量,因爲這些對象將保留在堆棧上,直到 - 至少 - 下一次運行循環。使用靜態字符串確保字符串對象只創建一次,而不是每次調用該方法。

這不是必須的,但是當您在移動設備上的內存量有限時,您希望儘可能在短時間內優化創建的對象數量。

+0

那麼我最好使用靜態NSString爲每個標識符? – 2013-03-12 20:12:58

+0

是的。老實說,如果你的表中有少量的行,它並沒有太大的區別 - iOS在垃圾收集方面已經有了很大的提高,特別是在ARC發佈之後。但即便如此,這是一個不費吹灰之力的優化,所以你不妨使用它。 – memmons 2013-03-12 20:14:16

+0

感謝這是一個好奇心,而不是一個突破問題,但很高興知道前進。謝謝。 – 2013-03-12 20:15:19

0

雖然我同意@Answerbot關於靜態字符串的性能方面,但也值得注意的是靜態字符串不太容易出錯。 IDE將自動完成靜態NSString對象,從而保證字符串的命名一致。

編輯:

如果使用下面的代碼:

static NSString *cellIndentifier = @"myCellIdentifier"; 

那麼你可以自由地使用變量「cellIdentifier」,而不用擔心實際字符串的拼寫被使用。

+3

這是什麼意思? Xcode會自動完成任何變​​量名稱。 – 2013-03-12 20:18:45

+1

xcode自動完成一切,無論它是靜態的,本地的還是宏。 – 2013-03-12 20:21:15

+0

是的,我的意思是說靜態NSString * cellIdentifier = @「cellIdentifier」;你可以在cellIdentifier變量中使用XCode的自動完成函數,而不是當你打算說@「cellIdentifier」 – JiuJitsuCoder 2013-03-12 20:24:23

3

當聲明變量static時,程序中只有一個該變量的實例。由於這是一次只分配一次的恆定值,因此此方法避免爲其保留並分配堆棧變量。當然,這個堆棧變量幾乎肯定會被編譯器優化,並且字符串contant已經被編譯器優化到靜態存儲中。所以這是一個非常小的優化,與開發人員意味着什麼(即所有實例共享相同的值)一樣。