NSString:为什么使用static over literal?

时间:2011-11-21 17:43:34

标签: objective-c static nsstring string-literals

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;
}
  1. 为什么要将NSString声明为static?为什么不使用字符串文字,如下所示?

    // 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;
    }
    
  2. 我应该何时使用静态文字与NSStringNSObject,scalors(NSIntegerCGFloat等),等等。 >

  3. 使用文字NSInteger而不是定义指向它并使用它的静态变量是否更高效?

1 个答案:

答案 0 :(得分:8)

static允许您只定义要使用的NSString对象的一个​​实例。如果您使用了字符串文字,则无法保证只创建一个对象;编译器可能会在每次调用循环时最终分配一个新字符串,然后将其传递给dequeue方法,该方法将使用字符串比较来检查是否有任何单元格可用。

在实践中,没有区别; static或literal都可以正常工作。但是对于静态,你告诉Obj-C每次都应该使用相同的实例。虽然对于这种情况,这不太可能导致任何问题,但如果您打算始终使用相同的对象,则使用静态是一种好习惯。