1

由于某种原因,该tableView: titleForHeaderInSection:方法导致应用程序崩溃,但没有提供任何详细信息。我知道这是这种方法,因为当我将其注释掉时,表格会加载,但显然没有标题。

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *monthArray = [NSArray arrayWithObjects:@"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December", nil];

 NSCalendar *calendar= [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
 NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit;
 NSDate *date = [NSDate date];
 NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date];

 NSInteger year = [dateComponents year];
 NSInteger month = [dateComponents month];

 currentYear = [NSString stringWithFormat:@"%d", year];
 nextYear = [NSString stringWithFormat:@"%d", year+1]; 

 [dateComponents setMonth:month];

 currentYearMonths = [[NSMutableArray alloc] init];
 nextYearsMonths = [[NSMutableArray alloc] init];

 for(uint i=month-1; i<=11; i++){
  [currentYearMonths addObject:[monthArray objectAtIndex:i]];
 }
 for(uint i=0; i<month-1; i++){
  [nextYearsMonths addObject:[monthArray objectAtIndex:i]];
 }

 [calendar release];
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
 NSString *sectionHeader = nil;

 if(section == 0) {
  sectionHeader = currentYear;
 }
 if(section == 1) {
  sectionHeader = nextYear;
 }  
 return sectionHeader; 
}
4

3 回答 3

2

我猜是在你currentYearnextYear委托方法被调用之前被释放。尝试retain使用这些 ivars。

于 2009-11-18T21:47:15.683 回答
1

您缺少一些保留语句,请查看下面设置的位置currentYearnextYear查看应该解决的问题。

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *monthArray = [NSArray arrayWithObjects:@"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December", nil];

    NSCalendar *calendar= [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit;
    NSDate *date = [NSDate date];
    NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date];

    NSInteger year = [dateComponents year];
    NSInteger month = [dateComponents month];

    currentYear = [[NSString stringWithFormat:@"%d", year] retain];
    nextYear = [[NSString stringWithFormat:@"%d", year+1] retain]; 

    [dateComponents setMonth:month];

    currentYearMonths = [[NSMutableArray alloc] init];
    nextYearsMonths = [[NSMutableArray alloc] init];

    for(uint i=month-1; i<=11; i++){
        [currentYearMonths addObject:[monthArray objectAtIndex:i]];
    }

    for(uint i=0; i<month-1; i++){
        [nextYearsMonths addObject:[monthArray objectAtIndex:i]];
    }

    [calendar release];
}
于 2009-11-18T21:51:03.377 回答
0

正如其他人所说,您的实例变量引用的对象没有被正确保留。

需要明确的是,您用来获取字符串的“便利”方法确实分配了新字符串。他们还将新对象放入自动释放池中。

例如,使用“方便”的方法:

currentYear = [NSString stringWithFormat:@"%d", year];

是相同的:

currentYear = [[[NSString alloc] initWithFormat:@"%d", year] autorelease];

由于您想保留这些字符串对象,您可以使用:

currentYear = [[NSString alloc] initWithFormat:@"%d", year];

但你也可以这样做:

currentYear = [[NSString stringWithFormat:@"%d", year] retain];

更新
另外,请记住,您应该在类的 dealloc 的实现中释放实例变量。

于 2009-11-19T10:55:35.983 回答