2013-03-12 112 views
10

我总是看到样板为UITableViewController为CellIdentifier使用静态NSString的优势是什么?

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

声明

static NSString *CellIdentifier 

为什么静态的?我在很多地方改变了这个,因为我的CellIdentifier基于该部分而改变?这背后的推理是静态的吗?我是否影响表现?

回答

21

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

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

+0

那么我最好使用静态NSString为每个标识符? – 2013-03-12 20:12:58

+0

是的。老实说,如果你的表中有少量的行,它并没有太大的区别 - iOS在垃圾收集方面已经有了很大的提高,特别是在ARC发布之后。但即便如此,这是一个不费吹灰之力的优化,所以你不妨使用它。 – memmons 2013-03-12 20:14:16

+0

感谢这是一个好奇心,而不是一个突破问题,但很高兴知道前进。谢谢。 – 2013-03-12 20:15:19

0

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

编辑:

如果使用下面的代码:

static NSString *cellIndentifier = @"myCellIdentifier"; 

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

+3

这是什么意思? Xcode会自动完成任何变​​量名称。 – 2013-03-12 20:18:45

+1

xcode自动完成一切,无论它是静态的,本地的还是宏。 – 2013-03-12 20:21:15

+0

是的,我的意思是说静态NSString * cellIdentifier = @“cellIdentifier”;你可以在cellIdentifier变量中使用XCode的自动完成函数,而不是当你打算说@“cellIdentifier” – JiuJitsuCoder 2013-03-12 20:24:23

3

当声明变量static时,程序中只有一个该变量的实例。由于这是一次只分配一次的恒定值,因此此方法避免为其保留并分配堆栈变量。当然,这个堆栈变量几乎肯定会被编译器优化,并且字符串contant已经被编译器优化到静态存储中。所以这是一个非常小的优化,与开发人员意味着什么(即所有实例共享相同的值)一样。