Подтвердить что ты не робот

Почему статическое ключевое слово используется в идентификаторах UITableViewCell?

Я читал "статические" несколько раз, в том числе и перед публикацией этого вопроса. Я все еще ищу "Ага".

В контексте UITableView static появляется в Cell Identifiers в каждом фрагменте кода, на который я смотрел. Например, в недавнем CellForRowAtIndexPath:

    static NSString *defaultIndentifier = @"Managed Object Cell Identifier";

Мой вопрос: зачем нам и нужно использовать "статический"?

4b9b3361

Ответ 1

Итак, он будет построен только один раз. Если он не является статичным, вы будете делать его каждый раз, когда сообщение отправляется (что много)

Ответ 2

Здесь нет настоящей выгоды. В основном это всего лишь намек на то, что одно и то же значение используется для всех ячеек в этом конкретном бите кода. Поскольку сам идентификатор является постоянной строкой, он скомпилируется в неизменяемый фрагмент памяти и каждый раз ссылается на один и тот же указатель, например. при построении строки нет затрат, даже если вы удалите ключевое слово static.

Ответ 3

Мое предположение заключается в том, что, объявляя строку как статическую, каждый раз, когда она передается в -dequeueReusableCellWithIdentifier:CellIdentifierforIndexPath:, каждый раз используется один и тот же указатель (поскольку статически объявленные переменные выделяются только один раз в куче, очень рано в программе исполнение)

[NSString -isEqualToString:], скорее всего, реализован для выполнения сравнения с указателем, а затем сопоставление по типу, как резерв, который, как я полагал, мог бы сэкономить несколько циклов на каждой итерации.

Здесь не так много, потому что (a) перераспределение ячеек таблицы работает на типично очень маленьком наборе ячеек и хорошо оптимизировано, и (b) обновление таблицы является всплескным - это происходит один раз, а затем не повторится, пока пользовательские свитки или логика приложения не изменят содержимое - если вы в конечном итоге вызываете -reloadTable 100 раз в секунду, то, очевидно, что-то не так с вашей логикой приложения.

Я подозреваю, что ключевое слово static - это рудиментарное соглашение о наследии - возможно, в тот же день, Apple хэширует на указателе, вместо того, чтобы выполнять правильное сравнение строк.