Проблема с источником данных UITableView. Мой массив данных внезапно становится пустым, когда вызывается UITableView: cellForRowAtIndexPath: - PullRequest
1 голос
/ 10 марта 2012

Я работаю над Руководством по BNR по программированию для iOS, и у меня возникли проблемы с попыткой решить проблему разделения данных UITableView на разделы.Краткое изложение того, что я имею в виду, таково.Мне нужен был гибкий способ управления разделами tableView, поэтому я создал NSMutableArray для хранения разделов. Каждый объект в массиве представляет раздел таблицы через NSDictionary.Словарь содержит 2 ключа, строку для заголовка раздела и массив для хранения владения разделом.У меня есть небольшая подпрограмма, которая получает allPossesions из класса store и сортирует и сохраняет их в соответствующих массивах и словаре.Я работал над переписыванием своего кода, чтобы включить это, и я наткнулся на запутанный дорожный блок.Поскольку мое приложение работает в отладчике, я выбрасываю много NSLogs для отслеживания происходящего.Похоже, у меня нет проблем с доступом и регистрацией содержимого моего массива разделов или его обязательных требований в большинстве методов поддержки табличного представления;но когда вызывается cellForRowAtIndexpath, боги кода перестают мне улыбаться.Каким-то образом, когда я пытаюсь получить доступ или выйти из массива моего имущества, он внезапно становится пустым.

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

Наконец, вот мой журнал попыток запустить приложение.Маленький зеленый индикатор находится прямо на линии, где я пытаюсь записать содержимое разделов во время cellForRow ....... после сбоя приложения.

2012-03-10 06:22:00.177 HomePwnr[44399:f803] ItemsViewController init called
2012-03-10 06:22:00.180 HomePwnr[44399:f803] divideSections called
2012-03-10 06:22:00.181 HomePwnr[44399:f803]  End of divideSections sections holding (
)
2012-03-10 06:22:00.188 HomePwnr[44399:f803] divideSections called
2012-03-10 06:22:00.189 HomePwnr[44399:f803]  End of divideSections sections holding (
)
2012-03-10 06:22:00.189 HomePwnr[44399:f803] returning number of sections: 0
2012-03-10 06:22:00.190 HomePwnr[44399:f803] returning number of sections: 0
2012-03-10 06:22:00.191 HomePwnr[44399:f803] viewWillAppear called - sections = (
)
2012-03-10 06:22:04.234 HomePwnr[44399:f803] addNewPossession called - sections = (
)
2012-03-10 06:22:04.235 HomePwnr[44399:f803] divideSections called
2012-03-10 06:22:04.237 HomePwnr[44399:f803]  End of divideSections sections holding (
        {
        Header = "Cheap Stuff";
        Possessions =         (
            "Shiny Gun (7R3K0): Worth $40, recorded on 2012-03-10 11:22:04 +0000"
        );
    }
)
2012-03-10 06:22:04.238 HomePwnr[44399:f803] returning number of sections: 1
2012-03-10 06:22:04.239 HomePwnr[44399:f803] tableView:titleForHeaderInSectionCalled - sections = (
        {
        Header = "Cheap Stuff";
        Possessions =         (
            "Shiny Gun (7R3K0): Worth $40, recorded on 2012-03-10 11:22:04 +0000"
        );
    }
)
2012-03-10 06:22:04.240 HomePwnr[44399:f803] Returning My Stuff
2012-03-10 06:22:04.241 HomePwnr[44399:f803] tableView:titleForHeaderInSectionCalled - sections = (
        {
        Header = "Cheap Stuff";
        Possessions =         (
            "Shiny Gun (7R3K0): Worth $40, recorded on 2012-03-10 11:22:04 +0000"
        );
    }
)
2012-03-10 06:22:04.241 HomePwnr[44399:f803] Returning My Stuff
2012-03-10 06:22:04.243 HomePwnr[44399:f803] tableView:cellForRowAtIndexPath called for section 0, Row 0
(lldb)

1 Ответ

2 голосов
/ 11 марта 2012

Ну, два предложения.Во-первых, нужно перейти на ARC (автоматический подсчет ссылок), чтобы компилятор позаботился обо всех ваших сохранениях / выпусках и т. Д.

Если не считать этого, ваша непосредственная проблема заключается в "DivisionSections", где вы освобождаете section1 и section2,Оба создаются с помощью вспомогательной подпрограммы dictionaryWithObject, которая возвращает автоматически выпущенный словарь.Таким образом, даже несмотря на то, что он сохраняется подпрограммой alloc и, добавляя ее в разделы массива, он имеет нулевое значение счетчика и может исчезнуть в любое время.(Вы можете знать, что это так из-за соглашения, что только подпрограммы с «alloc, copy или retain» будут возвращать сохраненные объекты)

Самый простой способ найти эти вещи - попросить Xcode проанализировать вместо Build,Это будет указывать на многие проблемы с памятью, подобные этой, а также на многие другие проблемы.

Этот код ссылается на мой комментарий ниже.Раздел должен быть свойством NSArray.Затем вы пишете метод получения следующим образом:

-(void) sections {
   if (!sections) {
      <<code from dividesections that ends with...>>
      self.sections = [NSArray arrayWithObjects: section1,section2,nil];
   }
   return sections;
 }

Таким образом, вы знаете, что разделы всегда верны, и вам не нужно беспокоиться о том, когда вы вызываете DivSections.

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