Таблица данных источников данных работает дважды, проблема области - PullRequest
0 голосов
/ 01 мая 2011

У меня есть UITableView, где numberOfSectionsInTableView и numberOfRowsInSection вызываются дважды, с проблемами области при втором запуске. Если я замаскирую проблему, я получу проблему с областью при первом запуске cellForRowAtIndexPath.

Большинство данных поступает из NSDictionary, который настраивается во время viewDidLoad. У меня также настроен NSArray одновременно. После установки они никогда не изменяются и не освобождаются.

Когда numberOfSectionsInTableView вызывается в первый раз, это нормально. Считает элементы по мере необходимости и т. Д. Затем он сразу вызывается во второй раз (понятия не имею, почему). При втором запуске он не может получить доступ к элементам NSDictionary или NSArray. Сбой даже при попытке NSLog их. Например:

NSLog(@"theMainDictionary %@",theMainDictionary);

обычно приводит к EXC_BAD_ADDRESS, но иногда что-то вроде этого:

theMainDictionary <_UITableViewSeparatorView: 0x4e73680; frame = (0 307; 320 1); opaque = NO; autoresize = W; layer = <CALayer: 0x4e4bf20>>

Опять же, эта же строка работает нормально (запись словаря в порядке ожидания) при первом запуске.

Если я замаскирую проблему, возвращая фиксированный NSInteger, то numberOfRowsInSection делает то же самое. Если я маскирую numberOfRowsInSection, cellForRowAtIndexPath вылетает при первом запуске. Однако та же проблема - не удается получить доступ к theMainDictionary или связанному NSArray.

Я не могу понять, почему они запускаются дважды - нигде нет reloadData. Также я не знаю, почему второй вызов проходит по-другому. Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 01 мая 2011

Вы, вероятно, создаете свой словарь с помощью [NSDictionary dictionary] или одного из нескольких аналогичных фабричных методов (который возвращает автоматически выпущенный экземпляр), а затем сохраняете его непосредственно в ivar, не сохраняя его.Он будет работать нормально до тех пор, пока ваша программа не вернется к основному циклу выполнения, после чего авто-релиз разрешится и объект будет освобожден.

Существует несколько способов исправить это:

  • Назначить объекту, объявленному retain, а не ivar.Это означает self.theMainDictionary, а не просто theMainDictionary.Это сохранит его для вас, поэтому оно будет сохраняться до тех пор, пока вы не отпустите его (или не назначите другому словарю или nil свойству).
  • Используйте [[NSDictionary alloc] init] (или один из многих других методов init) а не [NSDictionary dictionary] стиль.Это возвращает экземпляр, который у вас есть, поэтому он будет держаться до тех пор, пока вы его не отпустите.
  • Явно вызовите retain в словаре при сохранении его в ivar.Это берет на себя владение, поэтому оно будет сохраняться до тех пор, пока вы его не отпустите.

Во всех случаях не забудьте освободить словарь в вашем методе dealloc, иначе память утечет.1023 * Все вышеперечисленное, вероятно, относится и к массиву.См. документацию Apple для более подробного объяснения управления памятью в Какао.

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