2009-06-18 41 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”并将其忽略。