Настройка UITableViewCell сбой симулятора - PullRequest
0 голосов
/ 05 декабря 2009

В моем файле пера UIView у меня есть UITableView, который занимает примерно половину экрана. Соответствующие файлы .h и .m:

// helloViewController.h
#import <UIKit/UIKit.h>
@interface helloViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
    NSArray *locationArray;
}
@property (nonatomic, retain) NSArray *locationArray;
@end

// helloViewController.m
@synthesize locationArray;
- (void)viewDidLoad {
    locationArray = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8",  @"9",  @"10",  @"11", nil];
    [super viewDidLoad];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    [[cell textLabel] setText: [locationArray objectAtIndex:[indexPath row]]];

    return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 8;
}

Когда я запускаю это, он падает, когда я пытаюсь прокрутить таблицу (без ошибок в отладчике). Однако, если я заменю [[cell textLabel] setText: [locationArray objectAtIndex: [indexPath row]]]; с

[[cell textLabel] setText:@"Boom"];

... не падает ....

Что вызывает эту проблему? Делегат и источник данных связаны с владельцем файла в IB, а класс владельца файла установлен на правильный класс. Является ли проблемой то, что я использую табличное представление в uiview в nib?

Ответы [ 3 ]

1 голос
/ 05 декабря 2009

Проблема в том, что вы устанавливаете locationArray для объекта с автоматическим освобождением в viewDidLoad. Затем вы снова пытаетесь получить доступ к этому объекту, где хотите установить ячейку, но к тому времени массив был освобожден.

Вам следует использовать заданное вами свойство retain (вы устанавливаете массив напрямую, а не свойство) и узнать больше об управлении памятью ;)

self.locationArray = [NSArray arrayWith...];
0 голосов
/ 02 апреля 2012

Да, это из-за некоторой сохраненной памяти массива. Вы должны освободить массив Location Ivar с помощью метода dealloc. Используйте этот код

NSArray *array = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"4",nil];
self.locationArray = array ;
[array release];

В методе Dealloc

 [locationArray release];
0 голосов
/ 05 декабря 2009

Вероятно, это потому, что ваш locationArray ранее не сохранялся и теперь указывает на мусорную память. Это или locationArray не содержит элемент с указанным индексом.

...