2010-05-19 11 views
0

메모리 관리는 여전히 나를 슬프게합니다. I가 끝나면NSDate & Memory management

- (NSDate *)firstDayOfMonth { 
    NSDateComponents *tmpDateComponents = [[NSCalendar currentCalendar] 
              components:NSYearCalendarUnit | NSMonthCalendarUnit | NSEraCalendarUnit | NSWeekCalendarUnit | NSWeekdayOrdinalCalendarUnit 
              fromDate:self]; 
    [tmpDateComponents setDay:1]; 
    [tmpDateComponents setHour:0]; 
    [tmpDateComponents setMinute:0]; 
    [tmpDateComponents setSecond:0]; 
    return [[NSCalendar currentCalendar] dateFromComponents:tmpDateComponents]; 
} 

에 메소드 호출

NSDate *myNSDate = [[NSDate date] firstDayOfMonth]; 

를 사용 init로 그것이있는 NSDate 아이바을 이번에는이 카운트합니다 (바르가 정의되지 않은 참고 1에서 테인 호출 init을 재산으로).

viewWillAppear 메서드에 들어가면 myNSDate가 사라집니다. 나는 명시 적으로 그것을 유지하려고 노력했지만, 위의 방법을 다시 사용하여 iVar를 업데이트 할 때까지만 지속됩니다.

비록 내가 함수의 반환에 retain을 추가하지만, 누설 분석기가 오류를 던집니다.

내가 뭘 잘못하고 있니?

답변

2

귀하의 질문에 주어진대로 firstDayOfMonth 올바른 방법입니다. 그러나 해당 메서드의 반환 값은 자동 렌더링 된 날짜이므로 반환 값을 다른 위치에 유지하지 않으면 이 사라집니다.이 사라집니다. 당신이 명시 적도록 release 이전 값으로 확인하고 또한 반환 값을 유지 (그러나있어,이에

- (id) init { 
    if (self = [super init...]) { 
    ... 
    [self setFirstDayOfMonth:[[NSDate date] firstDayOfMonth]]; 
    } 
    return self; 
} 

- (void) setFirstDayOfMonth:(NSDate *)newFirstDay { 
    [firstDayOfMonth release]; 
    firstDayOfMonth = [newFirstDay retain]; 
} 

- (void) dealloc { 
    [firstDayOfMonth release]; 
    ... 
    [super dealloc]; 
} 

:

그래서 당신은 firstDayOfMonth 이름이 같은 (당신의 바르 가정을 할 필요가 메모리가 누출되지 않습니다.) 새 날짜를 설정하거나 객체가 할당 해제되고 날짜가 파괴 될 때까지 날짜 객체는 dealloc 메소드에서 삭제됩니다.

+0

안녕하세요, Dave, 변경, 작동 및 이해 ... 감사합니다. 많이 – iFloh