2011-03-19 1 views
0

이 코드 예제에서 NSCalendar 개체를 릴리스해야합니까? 아니면 코드의 마지막 줄이 "그레고리 안"변수에서 파생 된 newDate를 반환한다는 사실에 영향을 미칩니 까?이 코드 예제에서 NSCalendar 개체를 해제해야합니까?

#import "NSDateHelper.h" 


@implementation NSDate(NSDateHelper) 

-(NSDate *) setHour:(NSInteger)hour andMinute:(NSInteger)minute { 

    // Get Calendar for Existing Date 
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; 
    NSDateComponents *components = [gregorian components: NSUIntegerMax fromDate: self]; 

    // Set Hour and Minute 
    [components setHour: hour]; 
    [components setMinute: minute]; 
    [components setSecond: 00]; 

    // Create resultant Date 
    NSDate *newDate = [gregorian dateFromComponents: components]; 

    // Clean Up 
    [gregorian release]; // TODO: Do I release this here, or will it affect the return value not being valid? 

    return newDate; 
} 

@end 
+0

당신은 'NSUIntegerMax'를 dateFlags로 사용하지 말아야합니다. 불필요한 것들을 계산하는 데는 단지 1 년에 한 달이 아닌 하루를 계산하는 것보다 훨씬 더 오래 걸릴 것입니다. ps에 대해서는 –

답변

1

newDateautorelease과 함께 반환되므로 NSAutoreleasePool이 고갈 될 때까지 붙어 있습니다. newDate에 일정 인스턴스에 대한 참조가 필요한 경우 내부적으로 보유 수를 처리합니다.

+0

감사합니다. 제가이 질문을 대답으로 표시해야한다고 생각했습니다. 마지막 문장의 조건 – Greg

4

예.

구성 요소 변수는 필요한 것을 유지합니다. NSCalendar를 alloc'ing하여 소유권을 가져 오기 때문에, 당신은 그것을 릴리스해야합니다.

ps : set이라는 메서드에 대한 반환 값을 갖는 것은 매우 이상합니다. 나중에 많은 혼동을 피하기 위해 리팩토링을 추천합니다.

+0

+1입니다. 불변 객체에 대한 호출은 매우 잘못되었습니다. 나는 dateBySettingHour : andMinute :' –

+0

과 같은 이름을 제안 할 것입니다. 목표에 대한 새로운 조언을 해주셔서 감사합니다. – Greg

1

autorelease가 사용되지 않는 한 alloc'd 객체도 해제해야합니다.

이 예에서는 자동 릴리스가 사용되지 않으므로 릴리스해야합니다.