10

我总是看到UITableViewController声明的样板

static NSString *CellIdentifier

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

为什么是静态的?我已经在很多地方进行了更改,因为我的CellIdentifier更改基于该部分?这是静态的背后的原因是什么?我会影响性能吗?

4

3 回答 3

21

cellForRowAtIndexPath:被称为很多。每当您有一个在短时间内被反复调用的方法时,您希望最小化等待自动释放的对象的数量,因为这些对象将保留在堆栈中,直到 - 至少 -下一个运行循环。使用静态字符串可确保仅创建一次字符串对象,而不是每次调用该方法时。

这不是绝对必要的,但是当您在移动设备上的内存量有限时,您希望尽可能优化在短时间内创建的对象数量。

于 2013-03-12T20:11:22.580 回答
3

声明static变量时,程序中只有该变量的一个实例。由于这是一个只分配一次的常量值,因此这种方法避免了为其保留和分配堆栈变量。当然,堆栈变量几乎肯定会被编译器优化掉,并且字符串内容已经被编译器优化为静态存储。所以这是一个非常小的优化,它与其他任何东西一样暗示了开发人员的意思(即所有实例共享相同的值)。

于 2013-03-12T20:14:53.547 回答
1

虽然我同意@Answerbot 关于静态字符串的性能方面的看法,但同样值得注意的是静态字符串不易出错。IDE 将自动完成静态 NSString 对象,从而保证字符串的命名一致。

编辑:

如果您使用以下代码:

static NSString *cellIndentifier = @"myCellIdentifier";

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

于 2013-03-12T20:14:48.970 回答