2011-03-19 83 views
0

我是否需要在此代码示例中释放NSCalendar对象?或者这会影响到最后一行代码是否返回从“gregorian”变量派生的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。计算所有不必要的东西需要更长的时间,而不仅仅是年月和日。 – 2011-03-19 00:55:40

回答

1

发布没问题,newDate返回autorelease,所以它会一直存在,直到NSAutoreleasePool耗尽。如果newDate要求引用日历实例,它将在内部处理保留计数。

+0

感谢 - 我认为我应该将此标记为答案,就像它给出了额外的一点点最后一句的条款 – Greg 2011-03-19 03:50:54

4

是的,你释放。

您的组件变量将保留它所需的内容。由于您通过分配NSCalendar获得所有权,您有责任释放它。

ps:对一个名为set的方法返回值很奇怪。我会建议重构,以避免以后出现很多混乱。

+0

+1。在一个不可变对象上调用set会感觉非常错误。我会建议一个名称,如'dateBySettingHour:andMinute:' – 2011-03-19 00:52:45

+0

感谢您对命名的建议 - 这里新增了Objective C :) – Greg 2011-03-19 03:49:18

1

分配它的对象也应该释放它,除非使用自动释放。

本例中没有使用Autorelease,所以你必须确实释放它。

相关问题