iphone table cell сохранить / отпустить - PullRequest
1 голос
/ 12 августа 2009
UITableViewCell *cell = [tableView 
dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
 reuseIdentifier:CellIdentifier] autorelease];
 ...
 return cell;

Не будет ли этот код автоматически высвобождать ячейку, прежде чем что-либо сделать с ней? Сама ячейка, насколько я знаю, не имеет никакого сохранения, и когда вернется ell, вероятно, наступит авто-релиз, не так ли?

Кажется, это работает в любом случае, я просто хотел бы полностью понять, почему это так.

Ответы [ 3 ]

2 голосов
/ 12 августа 2009

Авторелизы не «включаются» до тех пор, пока не истечет NSAutoreleasePool, что не происходит, когда метод возвращается. Если вы не создадите NSAutoreleasePool вручную, пул будет очищен во время цикла событий. Пока вы добавляете ячейку таблицы в UITableView (который сохраняет ее), прежде чем вернуться в цикл обработки событий, ячейка будет оставаться на месте.

1 голос
/ 12 августа 2009

Когда вы возвращаете ячейку, вы следуете стандартному соглашению о том, что объекты, созданные методами, автоматически высвобождаются и что, если что-то заботится об объектах, оно должно их сохранять.

В этом случае этим «чем-то» является UITableView, запрашивающий у вас ячейку. Когда этот метод возвращает ячейку, то вызывающий вас код сохраняет ее и сохраняет до тех пор, пока не будет выпущено табличное представление.

Так почему же автоматическое освобождение не приводит к его освобождению до его возвращения? Потому что все, что происходит в Objective-C, находится в так называемом RunLoop, что означает именно это - это цикл, который запускается снова и снова. После того, как табличное представление заканчивает вызывать вас, оно возвращается, затем возвращается элемент, сообщающий табличному обновлению об обновлении, и так далее, пока не будет достигнут верхний цикл выполнения - в это время выполняются авто-релизы, и количество сохраняемых ячеек уменьшается на единицу. Но опять же, это нормально, потому что UITableView сохранил его.

0 голосов
/ 12 августа 2009

стоит немного больше справиться с управлением памятью iPhone.

Как правило, [alloc] и [copy] увеличивают ваш счет удержания на единицу. Итак, следующая строка:

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
 reuseIdentifier:CellIdentifier] autorelease];

увеличивает количество сохраняемых элементов вашего нового объекта ячейки с нуля до единицы.

Вы можете , затем вручную уменьшите счет удержания до нуля, когда закончите, набрав следующее:

[cell release];

вместо авто-релиза. Это уменьшит количество сохраняемых данных до нуля, после чего система iPhone автоматически освободит память для этого объекта. [Обратите внимание, что вы никогда не вызываете [cell dealloc] напрямую - скорее, dealloc автоматически происходит, когда счетчик удержаний возвращается к нулю.]

Однако , вы не можете легко знать, когда эта ячейка больше не потребуется. Поэтому вместо этого вы используете [autorelease].

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

Пока у вас есть ссылка на объект ячейки, она не будет автоматически освобождена. В тот момент, когда у вас нет ссылки на него, он будет добавлен в пул авто-релизов и со временем будет освобожден.

Извините, что это немного связано - это помогает ??!

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