Допустим, у меня есть свойство в контроллере представления, определенное следующим образом:
@property (nonatomic, retain) UIImageView *checkmarkOffAccessoryView;
I @synthesize
это в реализации, release
это в -dealloc
и инициализация его в -viewDidLoad
следующим образом:
self.checkmarkOffAccessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]] autorelease];
Пока все хорошо.
Когда я использую его в моем делегате табличного представления в качестве вспомогательного представления для нескольких ячеек, происходят две вещи:
- Изображение только одной ячейки показывает изображение
- Интерфейс приложения зависает.
Приложение не падает, насколько я могу судить, пользовательский интерфейс просто перестает отвечать на запросы.Это как в симуляторе, так и на устройстве.
Вот как я использую инициализированное свойство с моей ячейкой:
- (UITableViewCell *) tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// initialize or dequeue cell...
if (condition)
cell.accessoryView = self.checkmarkOffAccessoryView;
else
cell.accessoryView = nil;
}
С вышеупомянутым кодом, только одна ячейка показывает вспомогательный види пользовательский интерфейс зависает.
Если я инициализирую экземпляр UIImageView
непосредственно в методе делегата, я получаю все удовлетворяющие условию ячейки, показывающие вспомогательное представление, и я не испытываю зависания пользовательского интерфейса:
- (UITableViewCell *) tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// initialize or dequeue cell...
if (condition)
cell.accessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]] autorelease];
else
cell.accessoryView = nil;
}
Моя цель - инициализировать как можно меньше объектов и повторно использовать один UIImageView
.Мне любопытно, почему первый кусок кода проблематичен и что я мог сделать, чтобы это исправить.
Кажется, что свойство accessoryView
ячейки должно просто увеличивать число retain
на self.checkmarkOffAccessoryView
, но, похоже, мне не хватает некоторых деталей.
Что я упустил?Спасибо за ваш совет.
РЕДАКТИРОВАТЬ
Я думаю, что:
self.checkmarkOffAccessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]] autorelease];
совпадает с:
UIImageView *uncheckedView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]];
self.checkmarkOffAccessoryView = uncheckedView;
[uncheckedView release];
В любом случае, у меня один и тот же симптом замораживания.