使用静态NSString作为CellIdentifier的优势是什么?

10

我经常看到针对UITableViewController的样板文件声明。

static NSString *CellIdentifier

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

为什么要使用静态变量?因为我的CellIdentifier根据不同的section会发生变化,我已经在很多地方对此进行了更改。那么为什么要使用静态变量呢?这样做会影响性能吗?

3个回答

21

cellForRowAtIndexPath:会被频繁调用。无论何时,当你有一个在短时间内反复调用的方法时,你都希望最小化等待自动释放的对象数量,因为这些对象将保留在堆栈中,至少直到下一个运行循环结束。使用静态字符串确保字符串对象只被创建一次,而不是每次调用方法时都创建。

虽然不是绝对必要的,但在移动设备上拥有有限的内存时,可以尽可能地优化在短时间内创建的对象数量。


那么,对于每个标识符,我最好使用静态NSString吗? - j_mcnally
3
有经验的开发者会知道你的意思,但称之为“垃圾回收”对新手开发者来说很令人困惑。iOS没有垃圾回收机制,它有自动释放池和ARC,它们的实现方式不同,并且与垃圾回收器产生不同的权衡。 - Rob Napier
5
这不是垃圾回收,不当使用这个术语只会让那些对 Objective-C 不太熟悉的用户更加困惑。 - Jon Shier
是的,你们说得对。抱歉——我失落已久的.NET背景正在展现:D。 - memmons
1
最好是正确的,而且真正的垃圾回收和自动释放池之间存在显着的差异。无论如何,更新了答案以反映这一点。 - memmons
显示剩余4条评论

3
当一个变量被声明为static时,在程序中只有一个该变量的实例。由于这是一个只分配一次的常量值,这种方法避免了为其保留和分配堆栈变量。当然,编译器几乎肯定会优化掉那个堆栈变量,并且字符串常量已经由编译器优化为静态存储。因此,这只是一个相当小的优化,更像是开发人员意图的提示(即所有实例共享相同的值)而已。

1

虽然我同意@Answerbot关于静态字符串性能方面的观点,但值得注意的是静态字符串更少出现错误。IDE将自动完成静态NSString对象,从而保证字符串名称一致。

编辑:

如果您使用以下代码:

static NSString *cellIndentifier = @"myCellIdentifier";

你可以自由使用变量“cellIdentifier”,而不必担心实际字符串的拼写。


3
你的意思是什么?Xcode将自动完成任何变量的名称。 - jscs
1
Xcode会自动补全所有内容,无论是静态的、本地的甚至是宏。 - Hermann Klecker
是的,我的意思是通过声明 static NSString *cellIdentifier = @"cellIdentifier";,你可以利用 XCode 的自动完成功能来输入 cellIdentifier 变量,而不是可能出错并写成 @"CellIdentifier" 或者 @"cellidentifier",当你本意是要写成 @"cellIdentifier"。 - JiuJitsuCoder
这与它是“静态”的事实无关;这只是声明变量而不是在多个地方使用相同的文字字符串的原因。 - jscs
最近我开始放弃使用静态字符串作为单元格标识符的引用。现在我通常会这样做:NSString *cellIdentifier = NSStringFromClass([MyCustomCell class]); 这使我能够在设计时检查正确的类,而不是输入一个神奇的字符串。 - memmons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接