0

My NSMutableArray lOfSegments, объявленный как IVAR, заселяется правильно. Во время отладки он отображает 4 объекта в массиве.ARC освободить мой NSmutablearray до NSTableview reloaddata

for (int x=0; [arrayOfSegmentsTcIn count]>x; x++) { 

    NSDictionary *segmentDic=[[NSDictionary alloc] initWithObjectsAndKeys: [arrayOfSegmentsNumbers objectAtIndex:x],@"segment",[arrayOfSegmentsTcIn objectAtIndex:x],@"tc_in",[arrayOfSegmentsTcOut objectAtIndex:x],@"tc_out", nil]; 
    [lOfSegments addObject:segmentDic]; 
    [myDMXML.segments addObject:segmentDic]; 

} 

[self.xmlTCLable setStringValue:[myDMXML startTimeCode]]; 
[self.xmlDurationLable setStringValue:[myDMXML duration]]; 
[self xmlValidationCheck]; 
NSLog(@"arrayController:%@",[lOfSegments valueForKey:@"segment"]); 
[self.tableViewOutlet reloadData]; 

список NSLog массив правильно, но когда reloadData выполняется код переходит к

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { 
return [lOfSegments count]; 
} 

Массив является пустым.

Объект инициализируется в viewDidLoad в

lOfSegments = [[NSMutableArray alloc]init]; 

Пожалуйста, помогите!

+0

Вы можете показать больше кода? Почему ивар, а не собственность? Можете ли вы показать остальную часть вашего кода протокола UITableViewDataSource? – mbm29414

ответ

1

Во-первых, я рекомендую сделать ваш код более понятным здесь, используя self.lOfSegments, а не напрямую обращаться к ivar. (Тот факт, что у ivar отсутствует ведущий _, также очень подозрительный, и поднимает вопрос о том, является ли это даже той переменной, которую вы так думаете.)

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

  • наиболее вероятной причиной является что вы вызвали код инициализации до viewDidLoad, а затем viewDidLoad сдули массив. Многие вещи могут выполняться до viewDidLoad, а viewDidLoad может запускаться более одного раза (по крайней мере, это было правдой, мне нужно было изучить, будут ли изменения в загрузке iOS 6 гарантированы для запуска один раз.)
  • У вас есть другой способ сброса lOfSegments между временем запуска кода инициализации и временем reloadData. Если вы надежно используете self., тогда вы можете переопределить setLOfSegments:, чтобы вы могли его зарегистрировать. Или вы можете отметить это свойство только для чтения, чтобы вы могли его предотвратить. Это одна из многих причин, по которым вы должны использовать свойства, а не ivars.
  • Код настройки не выполнен до reloadData. Убедитесь, что оператор журнала фактически напечатан до получения reloadData и находится в одной очереди (идентификатор очереди будет частью вывода NSLog в скобках). Я не думаю, что это, скорее всего, дает ваше описание, но это обычная проблема.
  • Имеются два экземпляра этого объекта. Убедитесь, что объект, который запускал ваш код инициализации, - это тот же объект, который выполнял reloadData. Это более распространенная ошибка, которую вы можете подумать. Log self и убедитесь, что адрес памяти в обоих случаях одинаковый.
+0

Привет, Спасибо за ваше время. Я попытался использовать свойство, но это не имеет никакого значения. Свойство было объявлено как (неатомное, сохраняемое). И была использована точечная нотация. – Dario

+0

И вы пытались переопределить 'setLOfSegments:', чтобы увидеть, когда он вызван в отношении 'reloadData'? –

+0

Фактически, вы правы, данные перезагрузки называет другой объект. Они имеют совершенно другой адрес памяти, и если я пытаюсь загрузить больше данных в массив, он продолжает расти, но reloadData вызывает объект, который равен нулю. Как я избегаю этого? – Dario

0

похоже, что у вас есть переменная с таким же именем lOfSegments по методу viewDidLoad. Итак, в viewDidLoad вы используете переменную стека, в numberOfRowsInTableView - переменную экземпляра.

Или, может быть, tableViewOutlete.dataSource указывая на различные viewController

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