NSString:为什么使用静态而不是文字?
Master-Detail Xcode 项目模板生成如下代码:
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
为什么将
NSString
声明为static
?为什么不直接使用字符串文字,如下所示?// 自定义表格视图单元格的外观。 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 如果(单元格==零){ cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@"Cell"]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } [自我配置Cell:索引路径处的单元格:索引路径]; 返回单元格; }
什么时候应该对
NSString
、NSObject
、标量(NSInteger
、CGFloat
等)使用静态而不是文字.) 等?使用文字
NSInteger
是否比定义指向它并使用它的静态变量更高效?
The Master-Detail Xcode Project Template generates code like:
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
Why declare the
NSString
asstatic
? Why not just use the string literal, like below?// Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } [self configureCell:cell atIndexPath:indexPath]; return cell; }
When should I use static over literals with
NSString
,NSObject
, scalors (NSInteger
,CGFloat
, etc.), etc.?Is it more performant to use a literal
NSInteger
rather than defining a static variable that points to it and using that?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
static 允许您仅定义要使用的 NSString 对象的一个实例。如果您使用字符串文字,则无法保证只会创建一个对象;相反,编译器可能会在每次调用循环时分配一个新字符串,然后将其传递给出队方法,该方法将使用字符串比较来检查是否有任何单元可用。
实际上,没有什么区别;静态或文字都可以正常工作。但是通过静态,你告诉 Obj-C 它应该每次都使用相同的实例。尽管对于这种情况,这不太可能给您带来任何问题,但如果您打算始终使用同一对象,那么使用 static 是一个很好的做法。
The static allows you to define only one instance of the NSString object to be used. If you used the string literal instead, there's no guarantee that only one object will be created; the compiler may instead end up allocating a new string every time the loop is called, and then passing that to the dequeue method, which will use string comparison to check if any cell is available.
In practice, there's no difference; both static or literal will work fine. But with the static you're telling Obj-C that it should use the same instance every time. Although for this case this would very unlikely cause any problems for you, it's good practice to use static if you plan to always use the same object.