2009-06-18 37 views
0

我對以下行感到困惑:「靜態NSString * MyIdentifier = @」MyIdentifier「;」在方法中:cellForRowAtIndexPath「MyIdentifier」在Objective-c或iPhone編程中意味着什麼

該行有什麼作用? 它只是創建一個指向NSString對象的隨機指針併爲其分配字符串? 爲什麼它被稱爲MyIdentifier,我在很多例子中都看到了這一點。

#import "AddToFavorites.h" 


@implementation AddToFavorites 

- (id)initWithStyle:(UITableViewStyle)style { 
    if (self = [super initWithStyle:style]) { 
    } 
    return self; 
} 


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 


- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section { 
    return 5; 
} 


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

static NSString *MyIdentifier = @"MyIdentifier"; 

UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:MyIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
reuseIdentifier:MyIdentifier] autorelease]; 
} 
// Configure the cell 

return cell; 
} 

@end 

這裏是另一個例子,這個例子有一個不同的字符串CellIdentifier。

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

static NSString *CellIdentifier = @"TimeZoneCell"; 

UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [self tableviewCellWithReuseIdentifier:CellIdentifier]; 
} 

[self configureCell:cell forIndexPath:indexPath]; 
return cell; 
} 

回答

6

UITableViews可以自動重用單元格以節省內存。爲了利用這個優勢,你必須指定一個「重用標識符」,UITableView使用這個標識符來查找現有的單元格(「dequeueReusbaleCellWithIdentifier」),如果它找不到一個相同的標識符現有單元格。

該行創建一個靜態變量(全局,因爲它由所有代碼路徑共享,並且只初始化一次,但本地只能在此方法中訪問它)來保存標識符的NSString。我的猜測是,這是爲了確保每次都使用相同的指針,因爲比較指針是快速和容易的,而比較字符串的內容可能需要更長的時間。

1

爲了提高性能,還要從編譯器獲取拼寫錯誤的幫助。如果您使用@「」 - 字符串文字,則不會檢查您的標識符。如果拼錯了靜態標識符,編譯器會將您誤認爲是錯誤的。另外codesense會自動完成靜態標識符。

0

標識符是一個鍵或標籤,允許您爲不同的目的有多個單獨的單元集合。

這節省了您的時間和RAM內存 - 讓我們來了解如何。

假設您有一個聯繫人列表應用程序,有兩種類型的聯繫人,企業和朋友。

如果您想要以不同的方式顯示,可以設計兩種類型的單元格 - 一種帶有圖片(朋友照片)和黑色字體名稱,另一種僅帶有公司名稱,沒有圖片或圖標。

當用戶使用該應用程序時,可能需要先顯示名稱以「A-M」開頭的3個朋友和4家公司,因此需要3個朋友單元和4個公司單元。您將它們傳遞給它們,並將所有標識符爲「朋友」的朋友單元格和標識符爲「business」的所有商業單元格加上標籤。

當後來的視圖發生變化,只想要以「P-T」開頭的名稱時,您可能只有7家企業。理想情況下,您將重新使用您已經創建的單元格,因此它請求7個單元格,標識符爲「business」,事實證明,您已經使用「business」標記了已經創建的4個單元格,因此它只是重新使用這些單元格。您創建的剩餘3個標籤有錯誤,因此它會忽略這些標籤(或者可能刪除它們),並創建3個新的業務類型單元格,併爲它們提供標籤「business」。

通過以這種方式重複使用單元,您可以節省內存(每個類型只需要一次顯示多個單元格)和性能(無需在滾動時分配和初始化新單元格上和下)。您將這種情況與編寫該選擇代碼並提供事件ID的額外程序員努力進行交易。

它們可以基於Objective-C類型自動標記單元格,但如果以編程方式創建單元格的內容而不是子類化或使用「接口」構建器來佈局單元格,則不起作用。所以他們提供了標識符機制。

如果您的表格中只有一種類型的單元格,請將其稱爲「Alice」並將其忽略。