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

デリゲートメソッドが呼び出される前に解放されているとcurrentYear思います。それらのイーバーをnextYear試してみてください。retain

于 2009-11-18T21:47:15.683 に答える
1

いくつかの保持ステートメントがありません。設定currentYearした場所の下nextYearを見て、何を修正する必要があるかを確認してください。

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

UPDATE
また、クラスの dealloc の実装でインスタンス変数を解放する必要があることに注意してください。

于 2009-11-19T10:55:35.983 に答える