设置UITableViewCell会使模拟器崩溃

时间:2009-12-05 19:59:14

标签: iphone uitableview uiviewcontroller nsarray

在我的UIView nib文件中,我有一个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中使用表格视图的问题吗?

3 个答案:

答案 0 :(得分:1)

问题是您在locationArray中将viewDidLoad设置为自动释放的对象。然后,您尝试再次在要设置单元格的位置访问此对象,但此时阵列已被释放。

您应该使用您定义的retain-property(您直接设置数组,而不是使用属性)和在内存管理上阅读更多内容。 ;)

self.locationArray = [NSArray arrayWith...];

答案 1 :(得分:0)

这可能是因为您之前未保留过locationArray,现在指向垃圾内存。那个,或者locationArray不包含指定索引处的项目。

答案 2 :(得分:0)

是的,因为数组保留了一些内存。 U应该在dealloc方法中释放Location数组Ivar。使用此代码

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

在Dealloc方法中

 [locationArray release];