我以爲我在這裏做的是正確的事情,但我從構建和分析中得到了幾個警告,所以現在我不太確定。我的假設是(a)我從一個函數(dateFromComponents:在這種情況下)獲得的對象已經設置爲autorelease和(b)我從函數返回的內容應該設置爲autorelease。因此我不需要發送autorelease或保留到dateFromComponents的結果:在我將它返回給調用者之前。是對的嗎?作爲一個方面說明,如果我將我的函數從newTimeFromDate重命名爲:gnuTimeFromDate,則分析器不會在此函數上給出任何警告。所有「新」*方法返回一個保留而不是自動釋放對象的慣例是什麼?我應該在返回對象之前發送retain或autorelease嗎?
Memory Management Programming Guide for Cocoa它說:「接收到的對象通常保證在接收方法內保持有效」,並且「該方法還可以安全地將對象返回到其調用者。」這導致我相信我的代碼是正確的。
然而,在Memory Management in Cocoa它說:「假設通過任何其他方法獲得的對象的保留計數爲1並駐留在自動釋放池中。如果您想保留它超出當前執行範圍,則必須保留它「。這導致我認爲我需要在返回NSDate對象之前做一個保留。
我正在開發10.6.2上的Xcode 3.2.1,目標是iPhone SDK 3.1.2。
這裏的的情況下,你的代碼無法讀取屏幕截圖:
//============================================================================
// Given a date/time, returns NSDate for the specified time on that same day
//============================================================================
+(NSDate*) newTimeFromDate:(NSDate*)fromDate
Hour:(NSInteger)hour
Minute:(NSInteger)min
Second:(NSInteger)sec
{
NSCalendar* curCalendar = [NSCalendar currentCalendar];
const unsigned units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents* comps = [curCalendar components:units fromDate:fromDate];
[comps setHour: hour];
[comps setMinute: min];
[comps setSecond: sec];
return [curCalendar dateFromComponents:comps];
}
感謝。爲了澄清這一點,我想我會保持結果返回原樣,自動釋放,並將名稱更改爲dateFromDate:WithHour:Minute:Second(直到我想出一個更好的名字)。 – progrmr 2009-11-16 18:11:43
完美的你也可以使它成爲一個實例方法放在'@category NSDate(MyDateAdditions)'中,並命名爲'dateWithHour:minute:second:'。這樣,原始日期將是接收者而不是另一個參數。 – 2009-11-16 20:37:05