2009-11-15 80 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

相关问题