2010-04-20 3 views
2

У меня есть табличный вид с высокими ячейками. Около 300 в высоту. Ячейки являются обычными и имеют ассоциированный наконечник. В cellForRowAtIndexPath я обращаюсь к объекту в массиве с помощью indexPath.row. Объект имеет свойства, которые я присваиваю метокам на пользовательской ячейке. Это отлично работает для первых двух ячеек. Как только я достаточно прокручу, чтобы создать третью ячейку, приложение выйдет из строя.Как устранить проблему освобождения объекта в uitableview?

Я NSZombieEnabled набор и вот результат:

2010-04-19 21:48:13.360 MyApp[54463:207] *** -[CALayer release]: message sent to deallocated instance 0xfc4e50 
(gdb) continue 
2010-04-19 21:48:18.382 MyApp[54463:207] *** NSInvocation: warning: object 0xfc4e50 of class '_NSZombie_CALayer' does not implement methodSignatureForSelector: -- trouble ahead 
2010-04-19 21:48:18.383 MyApp[54463:207] *** NSInvocation: warning: object 0xfc4e50 of class '_NSZombie_CALayer' does not implement doesNotRecognizeSelector: -- abort 
(gdb) continue 
Program received signal: “EXC_BAD_ACCESS”. 
(gdb) 

Я не уверен, что освобождаться. Как я могу отследить это до источника?

- EDIT -

Добавление реализации cellForRowAtIndexPath:

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

static NSString *CellIdentifier = @"Cell"; 

OrderCell *cell = (OrderCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"OrderCellView" owner:self options:nil]; 
    cell = [nib objectAtIndex:0]; 
} 

// Set up the cell... 
if(self.rows != nil){ 
    id obj = [self.rows objectAtIndex:indexPath.row]; 
    cell.orderId.text = [NSString stringWithFormat:@"%@",[obj objectForKey:@"OrderId"]]; 
    cell.orderName.text = [NSString stringWithFormat:@"%@",[obj objectForKey:@"OrderName"]]; 
} 

return cell; 
} 
+0

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

+0

Я добавил реализацию cellForRowAtIndexPath. Это более полезно? Благодарю. – 4thSpace

ответ

2

Вот решение:

Как уже упоминалось в ОП, это пользовательский элемент и загружает перо. Я использую

static NSString *CellIdentifier = @"Cell"; 

но не указал что-либо в IB для идентификатора. Это было пусто. После ввода «Cell» для идентификатора он теперь работает без проблем. Я предполагаю, что nib был освобожден от объекта ячейки, созданного в коде, поскольку у него был идентификатор, а другой - нет.

Мне было бы интересно узнать, почему идентификатор IB также так важен для ячейки в этом случае ... если кто-то может предоставить некоторые детали.

1

Вы должны прочитать документацию loadNibNamed:owner:options:. Ответ на вашу проблему дается там:

Вы должны сохранить либо возвращенный массив, либо объекты, которые он содержит вручную, чтобы предотвратить преждевременное освобождение объектов файла nib.

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

+0

Я создал @property (неатомный, сохраняю) NSArray * CellViewNib; и использовал self.CellViewNib в cellForRowAtIndexPath. Это не имело никакого значения. – 4thSpace

Смежные вопросы