【问题标题】:Should I send retain or autorelease before returning objects?在返回对象之前我应该​​发送保留还是自动释放?
【发布时间】:2010-12-16 20:04:46
【问题描述】:

我认为我在这里做的事情是正确的,但是我从 Build and Analyze 收到了几个警告,所以现在我不太确定。我的假设是(a)我从函数(dateFromComponents:在这种情况下)获得的对象已经设置为自动释放,并且(b)我从函数返回的内容应该设置为自动释放。因此,在我将它返回给调用者之前,我不需要将自动释放或保留发送到 dateFromComponents: 的结果。对吗?

附带说明,如果我将函数从 newTimeFromDate: 重命名为 gnuTimeFromDate,分析器不会对此函数发出任何警告。是否所有“new*”方法都返回一个保留对象而不是自动释放对象?

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

【问题讨论】:

    标签: objective-c iphone cocoa-touch memory-management


    【解决方案1】:

    你几乎是对的。 clang 正确指出的唯一问题是您的方法承诺了一个保留计数 +1 对象(因为它的名称包含“new”),但您返回的是一个自动释放的对象。

    您有两个选择:从方法名称中删除“new”或保留返回的对象。返回自动释放的对象(如您所做的那样)并将方法命名为 timeFromDate: 更像 Cocoa-ish。

    【讨论】:

    • 感谢您澄清这一点。我想我会保持原样返回的结果,自动发布,并将名称更改为 dateFromDate:WithHour:Minute:Second(直到我想出一个更好的名称)。
    • 完美。您还可以将其作为@category NSDate (MyDateAdditions) 中的实例方法并将其命名为dateWithHour:minute:second:。这样,原始日期将是接收者,而不是另一个参数。
    猜你喜欢
    • 2011-11-18
    • 2023-04-05
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2011-07-01
    • 2011-08-29
    相关资源
    最近更新 更多