loadNibNamed утечка topLevelObjects
Я использую пользовательские ячейки и звоню loadNibNamed:
, Кажется, это вызывает утечку памяти, и я не уверен, как ее решить. Если я установлю объекты верхнего уровня в nil
после этого я все еще получаю утечку.
topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"customCell" owner:self options:nil];
Я тогда делаю это
for (id currentObject in topLevelObjects){
if ([currentObject isKindOfClass:[UITableViewCell class]]){
cell = (CustomCell *) currentObject;
break;
}
}
а затем измените свойства ячейки.
Пользовательская ячейка имеет строгую ссылку на свойство, это не круговая ссылка, поэтому я не уверен, что это проблема. Как правильно остановить эту потерянную память при использовании ARC?
3 ответа
Ответ Мэтта на месте. Вот как выглядит код. Исправлена проблема с памятью сразу, так как ячейка теперь загружена и снята с очереди в порядке.
Сначала зарегистрируйте перо
[self.tableView registerNib:[UINib nibWithNibName:@"customCell"
bundle:nil]
forCellReuseIdentifier:@"customCellID"];
Во-вторых...
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customCellID"];
Перо нуждается только в одной ячейке таблицы, и вы готовы!
Я подозреваю, что ваша утечка может исходить из розетки в кончике. Обратите внимание на эту фразу в документах на loadNibNamed:
:
Для установки подключений к розетке этот метод использует метод setValue:forKey:, который может привести к автоматическому сохранению объекта в розетке.
Другими словами, loadNibNamed
иногда накладывает дополнительное сохранение из-за странного способа работы кодирования значения ключа.
Тем не менее, это спекуляция, и в этом нет необходимости, потому что вам не нужно звонить loadNibNamed:
на первом месте!
Вы используете пользовательский подкласс UITableViewCell, разработанный в виде кончика? Тогда почему бы не сделать это обычным способом? Сделайте перо, содержащее один объект верхнего уровня: ячейку. Создайте ячейку в кончике, установите ее класс, подключите ее к розеткам и т. Д. registerNib:forCellReuseIdentifier:
на табличном представлении, чтобы рассказать табличному представлению о вашем наконечнике. Когда вы позже позвоните dequeueReusableCellWithIdentifier:
, если в куче повторного использования нет свободных ячеек, табличное представление загрузит ваше перо и передаст вам ячейку. Нет суеты, нет суеты.
Рассмотреть возможность использования UINib
вместо. UINib кэширует содержимое файла nib в памяти, сохраняя поездки в файловую систему. Так, например, вы можете создать экземпляр nib и ссылку в свойстве:
self.cellNib = [UINib nibWithNibName:@"customCell" bundle:nil];
В файле пера свяжите ячейку со свойством вашего контроллера табличного представления. Затем всякий раз, когда вам нужен экземпляр ячейки, спросите UINib
экземпляр, чтобы создать его для вас, и ссылка на новую ячейку будет автоматически сохранена в свойстве.
[self.cellNib instantiateWithOwner:self options:nil];
cell = self.customCell;
self.customCell = nil;
Этот подход должен помочь избежать проблем с управлением памятью, с которыми вы столкнулись при работе с массивом объектов верхнего уровня, а также значительно повысить производительность.