Что означает «MyIdentifier» в программировании Objective-c или iPhone - PullRequest
0 голосов
/ 19 июня 2009

Я озадачен в следующей строке "static NSString * MyIdentifier = @" MyIdentifier ";" в методе: cellForRowAtIndexPath

Что делает эта строка? Это просто создание случайного указателя на объект NSString и присвоение ему строки? Почему он называется MyIdentifier, я видел это во многих примерах.

#import "AddToFavorites.h"


@implementation AddToFavorites

- (id)initWithStyle:(UITableViewStyle)style {
  if (self = [super initWithStyle:style]) {
  }
  return self;
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return 1;
}


- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section {
  return 5;
}


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

static NSString *MyIdentifier = @"MyIdentifier";

UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
reuseIdentifier:MyIdentifier] autorelease];
}
// Configure the cell

return cell;
}

@end

Вот еще один пример, у этого есть другая строка, CellIdentifier.

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

static NSString *CellIdentifier = @"TimeZoneCell";

UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [self tableviewCellWithReuseIdentifier:CellIdentifier];
}

[self configureCell:cell forIndexPath:indexPath];
return cell;
}

Ответы [ 3 ]

6 голосов
/ 19 июня 2009

UITableViews может автоматически повторно использовать ячейки для экономии памяти. Чтобы воспользоваться этим преимуществом, вы должны указать «идентификатор повторного использования», который используется UITableView, чтобы иметь возможность искать существующие ячейки («dequeueReusbaleCellWithIdentifier») с тем же идентификатором, который вы создадите, если он не может найти существующая ячейка.

Строка создает статическую переменную (глобальную в том смысле, что она является общей для всех путей кода и инициализируется только один раз, но локальную в том, что вы можете получить к ней доступ только в этом методе) для хранения строки NSSt для идентификатора. Я предполагаю, что это делается для того, чтобы каждый раз использовать один и тот же указатель, поскольку сравнение указателей происходит быстро и легко, а сравнение содержимого строк может занять немного больше времени.

1 голос
/ 19 июня 2009

Для упомянутой выше производительности, а также для получения помощи от компилятора в обнаружении орфографических ошибок Там нет проверки вашего идентификатора, если вы используете @ "" - строковый литерал. Компилятор выдаст сообщение об ошибке, если вы неправильно введете статический идентификатор. Также Codesense будет автоматически заполнять статический идентификатор.

0 голосов
/ 19 июня 2009

Идентификатор - это ключ или тег, который позволяет вам иметь несколько отдельных наборов ячеек для разных целей.

Это экономит ваше время и оперативную память - давайте узнаем, как.

Предположим, у вас есть приложение со списком контактов, с двумя типами контактов: бизнесом и друзьями.

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

Когда пользователь использует приложение, ему может понадобиться отобразить 3 друзей и 4 компании с именами, начинающимися с «A-M», поэтому ему нужно 3 ячейки друга и 4 ячейки компании. Вы передаете им эти данные и помечаете все ячейки друзей идентификатором «друг», а все деловые ячейки - идентификатором «бизнес».

Когда в дальнейшем представление меняется и ему просто нужны имена, начинающиеся с "P-T", у вас может быть всего 7 предприятий. В идеале вы должны повторно использовать уже созданные ячейки, поэтому он запрашивает 7 ячеек с идентификатором «business», и получается, что вы уже пометили 4 ячейки, которые вы уже создали, с помощью «business», поэтому он просто повторно использует их. Оставшиеся 3, которые вы уже создали, имеют неправильный тег, поэтому он игнорирует их (или, возможно, удаляет их?), Создает 3 новые ячейки бизнес-типа и присваивает им тег «бизнес».

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

Они могли бы автоматически помечать ячейки на основе типа target-C, но это не сработало бы, если вы программно создали содержимое ячейки, а не создали подклассы или использовали конструктор интерфейса для разметки ваших ячеек. Таким образом, вместо этого они предоставляют механизм идентификатора.

Если у вас в таблице только один тип ячеек, просто назовите его «Алиса» и забудьте об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...