根据官方文件:

重用标识符与表视图的委托创建的UITableViewCell对象相关联,该对象旨在重用它作为表视图多行的基础(出于性能原因).它被分配给initWithFrame:reuseIdentifier:中的cell对象,此后无法更改.UITableView对象维护当前可重用单元的队列(或列表),每个单元都有自己的重用标识符,并使它们可供dequeueReusableCellWithIdentifier:方法中的委托使用.

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/reuseIdentifier

我不明白.嗯,我理解基本 idea ,我认为,你应该创建UITableViewCells,并尽可能多地重复使用,而不是制作新的(或类似的东西).但究竟是什么决定了一个细胞是否可以重复使用呢?如果我有两个相同的(视觉上的)单元格,但文本不同(我想它们不是完全相同),它们能有相同的标识符吗?还是应该有不同的?或者在什么情况下应该使用不同的标识符?

有人能澄清或链接到它所在的地方吗?

推荐答案

好吧,这就是我认为它的工作原理:

在tableView中使用dequeueReusableCellWithIdentifier,可以大大加快速度.不需要实例化很多单元格,只需根据需要实例化任意数量的单元格,即可视单元格(这是自动处理的).如果滚动到列表中的某个区域,其中有"单元格"尚未获得其视觉表示,而不是实例化新的单元格,则可以重用现有的单元格.

您可以通过以下方式自己try :

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    NSLog(@"new one");
}
else
{
    NSLog(@"old one");
}

请记住,您只希望dequeueReusableCellWithIdentifier返回一个适用的单元格.因此,如果一个单元要被重复使用,请确保它适合这种情况.这就是重用标识符的用途.通常,你只需要一个.但是可能有一个列表使用了几种不同类型的单元格,在这种情况下,您必须通过提供不同的重用标识符将它们分开.否则,您最终可能会得到一个被视为其他类型的单元的单元(例如,UITableView单元,而不是您想要的自定义单元).

所以基本上,据我所知,对不同类型的单元使用不同的重用标识符,其中种类意味着类.如果只使用标准单元格,则可能只需要一个reuseIdentifier.

这种设计模式被称为object pooling.

Objective-c相关问答推荐

react 本机WebView菜单项目props 无法在iOS&>=16上使用

在从 UIViewController 调用的非保留完成中引用 self 时,weakSelf/strongSelf 舞蹈真的有必要吗?

UIApplication.sharedApplication.delegate.window 和 UIApplication.sharedApplication.keyWindow 有什么区别?

如何删除警告按钮的框架在运行时会有所不同.

判断正在使用的应用程序版本

重复符号 _OBJC_METACLASS_$_ClassName

Facebook 的 UIActivityViewController 不显示默认文本

观察 UIDatePicker 的变化

如何在另一个视图中获取视图的框架?

带有 AVPlayer 的多个视频

dispatch_semaphore_dispose 上的 EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

如何从 AVPlayer(不是 AVAudioPlayer)获取持续时间?

自定义 UISwitch 和 App Store 批准

类在两者中都实现.将使用两者之一

iPhone - 什么是重用标识符(UITableViewCell)?

Objective-C:块 vs. Select 器 vs. 协议

如何在 Cocoa 中获取 NSArray 的第一个 x 元素?

如何在 UIAlertController 中添加 textField?

通过将另一个字符串重复给定次数来创建 NSString

如何在 Cocoa 中获取当前日期