2009-11-15 45 views
6

我以爲我在這裏做的是正確的事情,但我從構建和分析中得到了幾個警告,所以現在我不太確定。我的假設是(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。

screenshot of build/analyze output http://nextsprinter.mggm.net/Screen%20shot%202009-11-15%20at%2008.33.00.png

這裏的的情況下,你的代碼無法讀取屏幕截圖:

//============================================================================ 
// 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]; 
} 

回答

8

你是接近直角的。 clang正確指出的唯一問題是您的方法承諾保留count +1對象(其名稱包含「new」),但您返回的是自動釋放對象。

你有兩種選擇:從方法名稱去掉「新」或保留返回的對象很遠可可十歲上下返回自動釋放的對象(如你這樣做),並命名方法timeFromDate:

+0

感謝。爲了澄清這一點,我想我會保持結果返回原樣,自動釋放,並將名稱更改爲dateFromDate:WithHour:Minute:Second(直到我想出一個更好的名字)。 – progrmr 2009-11-16 18:11:43

+0

完美的你也可以使它成爲一個實例方法放在'@category NSDate(MyDateAdditions)'中,並命名爲'dateWithHour:minute:second:'。這樣,原始日期將是接收者而不是另一個參數。 – 2009-11-16 20:37:05

相關問題