2011-03-19 236 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,所以你必須確實釋放它。

相關問題