我需要在此代码示例中释放NSCalendar对象吗?

时间:2011-03-19 00:41:18

标签: ios objective-c memory-management nscalendar

我需要在此代码示例中释放NSCalendar对象吗?或者这会影响最后一行代码是返回newDate这个派生自“gregorian”变量的事实吗?

#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

3 个答案:

答案 0 :(得分:4)

是的,你释放。

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

ps:为名为set的方法设置返回值非常奇怪。我建议重构以避免以后出现很多混淆。

答案 1 :(得分:1)

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

此示例中未使用自动释放,因此您必须确实将其释放。

答案 2 :(得分:1)

发布很好,newDate会返回一个autorelease,因此会一直停留NSAutoreleasePool。如果newDate需要对日历实例的引用,它将在内部处理保留计数。