2011-01-13 44 views
20

我已经阅读了几次“静态”,包括发布这个问题之前。 我仍然在寻找一个“啊哈”。为什么在UITableViewCell标识符中使用static关键字?

在我看过的每一段代码中,在UITableView的静态环境中出现在单元标识符中。例如在最近的CellForRowAtIndexPath中:

static NSString *defaultIndentifier = @"Managed Object Cell Identifier"; 

我的问题是为什么我们需要和使用“静态”?

回答

11

因此它只会构造一次。如果它不是静态的,每次发送消息时都会发送一个(这是很多)

+0

如果通过“每次都创建一个”,你的意思是“将一个常量指针推入堆栈变量”,当然。但是,它和'int i = 3;'一样昂贵,因为编译器已经将'@“标识符”'编译成常量。唯一的一次静态实际上是一个好处是如果字符串是在运行时而不是使用常量字符串构造的。 –

+1

这仍然是一个好处。每次运行该方法时都会削减两个处理器周期(可能会很多次)。 – ughoavgfhw

+0

@ughoavgfhw是的,但它不会让你的二进制文件更大,并让你的应用程序使用更多的内存? – ma11hew28

18

这里没有真正的好处。这对读者来说只是一个提示,即在这段代码中的所有单元格都使用相同的值。由于标识符本身是一个常量字符串,因此它被编译成一个不可变的内存块,并且每次被引用为相同的指针,例如,即使删除关键字static,构建字符串也不会涉及成本。

+0

关于“标识符本身是一个常量字符串” – Philip007

0

我的猜测是,通过声明该字符串为静态,每次它被传入-dequeueReusableCellWithIdentifier:CellIdentifierforIndexPath:时,每次都使用相同的指针(因为静态声明的变量只在堆上分配一次,在程序执行的早期)

[NSString -isEqualToString:]最有可能实现首先执行指针比较,然后是字符明智的比较作为后备,我认为可以削减每次迭代几个周期。 (a)表格单元重新填充在通常非常小的一组单元上操作,并且已经很好地优化,以及(b)表格刷新是突发的 - 它发生一次并且那么直到用户滚动或应用程序逻辑更改内容时才会再次发生 - 如果最终每秒调用-reloadTable 100次,那么显然应用程序逻辑有问题。

我怀疑静态关键字是一个退化的遗留约定 - 也许早在今天,苹果公司对指针进行了散列,而不是执行适当的字符串比较。