2009-11-18 12 views
1

어떤 이유로 인해 tableView: titleForHeaderInSection: 메서드로 인해 응용 프로그램이 충돌하는 이유를 알 수 없습니다. 나는 그것이 주석으로 처리 할 때 헤더가 분명히 없기 때문에 테이블이로드되기 때문에이 방법이라는 것을 알고있다.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; 
} 

답변

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]; 
} 
2

나는 당신의 대리자 메서드가 호출되고 전에 currentYearnextYear이 출시되고있다 같은데요. 이 이삭을 먹는 retain을 시도하십시오.

+0

아,보다 빠릅니다 :-) +1이 자동으로 실행되는 변수 – Alfonso

+0

rson 일 가능성이 높습니다. 작동하지는 않지만, 아무 이유없이 추가 문자열을 할당하고 있습니다. 내 대답을 보라. – gerry3

0

다른 말처럼, 인스턴스 변수가 참조하는 개체가 제대로 유지되지 못했습니다.

분명히 말하자면, 문자열을 얻기 위해 사용했던 "편리함"메소드는 새로운 문자열을 할당합니다. 또한 새로운 객체를 자동 복구 풀에 넣습니다. 는 "편리한"방법을 사용하여 예를 들어

:

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

이러한 문자열 개체를 유지하려는 때문에, 당신은 그냥 사용할 수 있습니다 :

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

은과 동일

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

이 작업을 수행 할 수도 있습니다.

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


는 또한, 당신은 클래스의 dealloc의 구현에 인스턴스 변수를 해제해야 명심 UPDATE.

+0

고마운 게리 ... 나는 여전히 객관적인 전체 가비지 수집 측면에 대한 핸들을 얻으려고 노력하고 있습니다 ... 이건 좋은 tid 비트이고, 지금 제가 이전에 언급 한 내용에서 사용하고있는 것입니다. – rson

+0

실제로 이것은 (수동) 메모리 관리입니다. 가비지 수집을 사용하면 작업이 훨씬 쉬울 수 있지만 iPhone은 현재이를 지원하지 않습니다. – gerry3

관련 문제