我已多次阅读“静态”,包括在发布此问题之前。 我仍然在寻找一个“啊哈”。
在UITableView的上下文中,静态出现在我已经看过的每一段代码中的单元标识符中。例如,在最近的CellForRowAtIndexPath:
中 static NSString *defaultIndentifier = @"Managed Object Cell Identifier";
我的问题是为什么我们需要并使用“静态”?
答案 0 :(得分:18)
这里没有真正的好处。对于读者而言,这只是一个暗示,在这个特定的代码位中,所有单元都使用相同的值。由于标识符本身是一个常量字符串,它被编译成一个不可变的内存块,并且每次都被引用为相同的指针,例如即使您删除了static
关键字,也无需花费任何费用构建字符串。
答案 1 :(得分:13)
这样它只会被构造一次。如果它不是静态的,那么每次发送消息时都会制作一个消息(这很多)
答案 2 :(得分:0)
我的猜测是,通过将字符串声明为静态,每次传递到-dequeueReusableCellWithIdentifier:CellIdentifierforIndexPath:
时每次都使用相同的指针(因为静态声明的变量在堆上只分配一次,很早就在程序的执行)
[NSString -isEqualToString:]
最有可能首先执行指针比较,然后进行字符比较作为回退,我认为可以在每次迭代时减少几个周期。
没有太多可以从中获益,因为(a)表格单元重新填充在一组通常非常小的单元格上运行,并且得到了很好的优化,并且(b)表刷新是突发性的 - 它只发生一次然后在用户滚动或应用程序逻辑更改内容之前不会再次发生 - 如果您最终每秒调用-reloadTable
100次,那么您的应用程序逻辑显然有问题。
我怀疑静态关键字是一种遗留的传统约定 - 也许在当天,苹果公司对指针进行了调整,而不是执行正确的字符串比较。