UITableView вылетает при прокрутке - PullRequest
5 голосов
/ 29 ноября 2009

У меня есть TableView, который строит и рисует нормально, но затем падает при прокрутке представления. Я пробежал через отладчик, и кажется, что мои переменные уровня класса каким-то образом перезаписываются, поэтому они больше не существуют, когда снова вызывается titleForHeaderInSection. Очень странно, что если я заменю код:

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSString *sectionTitle = [favouritesDataSections objectAtIndex:section];
return sectionTitle;
}

с:

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSString *sectionTitle = @"Test";
return sectionTitle;
}

По-прежнему происходит сбой, но на этот раз отладчик не отображает строку NSString при наведении курсора на переменную sectionTitle.

Это код, который я использовал для создания представления и установки переменных уровня класса:

- (void)loadView {
[super loadView];
CGRect tableSize = CGRectMake(0,0,320,460);
UITableView *favouritesTableView = [[UITableView alloc] initWithFrame:tableSize style:UITableViewStylePlain];
favouritesTableView.autoresizingMask = (UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight);
favouritesTableView.dataSource = self;
favouritesTableView.delegate = self;
favouritesTableView.rowHeight = 52;
[self.view addSubview:favouritesTableView];
}

- (void)viewDidLoad {
[super viewDidLoad];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
// Get the full path of the favourites plist
NSString *filename = [documentsDirectory stringByAppendingPathComponent:@"Favourites.plist"];
// Initialise Dictionary and array
favouritesDataAll = [[NSMutableDictionary alloc] init];
favouritesDataSections = [[NSArray alloc] init];

NSDictionary *dict = [[[NSMutableDictionary alloc] initWithContentsOfFile:filename] retain];
favouritesDataAll = dict;
[dict release];

favouritesDataSections = [favouritesDataAll allKeys];   
}

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

С наилучшими пожеланиями

Dave

Ответы [ 3 ]

12 голосов
/ 29 ноября 2009

ОК, исправлено ... изменено

favouritesDataSections = [favouritesDataAll allKeys];

Кому:

favouritesDataSections = [[favouritesDataAll allKeys] retain];

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

Хотя я признаю, что все еще нахожусь на стадии «проб и ошибок» кодирования и не до конца понимаю, что я делаю (я уверен, что вы будете скучать, читая это). Мне было бы полезно, если у вас есть какие-либо мысли / комментарии, ссылки для дальнейшего чтения или публикации о том, как все это работает (то есть, когда и зачем использовать сохранение и т. Д.), Чтобы углубить мое понимание.

Еще раз спасибо, Дейв

4 голосов
/ 30 декабря 2009

Я бы порекомендовал использовать сеттеры @property, чтобы избежать этой проблемы, массив автоматически высвобождается, поэтому вы вызвали сохранение вручную, это решило проблему, но было бы проще использовать:

self.favoritesDataSection

Это автоматизировано @property (сохранить) retain означает, что retain вызывается, когда он установлен, и освобождается, если для него установлено значение nil или другой объект.

0 голосов
/ 29 ноября 2009

Похоже, что здесь происходит какое-то повреждение памяти.

Одна вещь, которую я вижу, состоит в том, что эти вызовы [super ...] должны выполняться после другого кода в этих методах.

Что произойдет, если вы настроите вид таблицы только на один раздел?

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