2009-11-29 2 views
5

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

-(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

+0

ОК, если я ставлю на сохранение в конце строки UITableView она работает в течение приблизительно 3 или четыре раза, а затем консоль дает: *** - [длина UISwipeGestureRecognizer]: непризнанный селектор направил к экземпляру 0x43325d0 –

+0

и также: *** Завершение приложения из-за неперехваченного исключения «NSRangeException», причина: «*** - [NSCFArray objectAtIndex:]: index (0) за пределами границ (0) ' –

+0

Хорошо, я закрою. Думаю, у меня сохранилась красная сельдь. Это потому, что я заменил titleForHeaderInSection на @ "Test", это сработало некоторое время. Ошибка консоли: *** Завершение приложения из-за неперехваченного исключения «NSRangeException», причина: «*** - [NSCFArray objectAtIndex:]: index (57744) за пределами границ (2) ' –

ответ

12

ОК, установил его ... изменил

favouritesDataSections = [favouritesDataAll allKeys]; 

To:

favouritesDataSections = [[favouritesDataAll allKeys] retain]; 

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

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

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

+0

Dave, перейдите и прочитайте правила управления памятью в документации Apple. Это элементарная ошибка, которую вы бы не сделали, если бы вы сначала прочитали немного. – NSResponder

+0

Очень полезно. У меня была аналогичная проблема. Благодаря!!!! – saimonx

0

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

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

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

+0

Привет, Грег, спасибо за быстрый ответ. К сожалению, включение супер в конце приводит к его сбою (т. Е. TableView даже не рисуется). Я также попытался установить количество секций вручную на 1, количество строк в секции до 1 и заголовок раздела на «Тест». Все еще падает на свиток. –

4

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

self.favoritesDataSection

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