NSString: зачем использовать static вместо литерала? - PullRequest
4 голосов
/ 21 ноября 2011

Шаблон проекта Xcode Master-Detail генерирует код, подобный следующему:

// 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. Когда я должен использовать статические над литералами с NSString, NSObject, scalors (NSInteger, CGFloat и т. д.) и т. д .?

  3. Является ли более производительным использование литерала NSInteger вместо определения статической переменной, которая на него указывает, и ее использования?

1 Ответ

8 голосов
/ 21 ноября 2011

Статика позволяет вам определять только один экземпляр объекта NSString, который будет использоваться. Если вы вместо этого использовали строковый литерал, нет гарантии, что будет создан только один объект; вместо этого компилятор может в конечном итоге выделить новую строку каждый раз, когда вызывается цикл, а затем передать ее методу dequeue, который будет использовать сравнение строк, чтобы проверить, доступна ли какая-либо ячейка.

На практике нет никакой разницы; и статический или буквальный будет работать нормально. Но со статикой вы говорите Obj-C, что он должен использовать один и тот же экземпляр каждый раз. Хотя в этом случае это вряд ли вызовет у вас какие-либо проблемы, рекомендуется использовать static, если вы планируете всегда использовать один и тот же объект.

...