【问题标题】:do I have to release the NSDate in this code below?我必须在下面的代码中释放 NSDate 吗?
【发布时间】:2011-08-30 20:27:46
【问题描述】:

我必须在下面这段代码中释放 NSDate 吗?

(也就是说,它只是在一个方法中创建为我不必担心的局部变量)

我问的原因是当我运行 XCode Profiler 并单击内存跳跃的一个点时,它突出显示了这段代码(即下面附加代码中的第一行)-即我正在查看探查器中的“泄漏块”表..

-(NSDate *) dateBySettingHour:(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];    // WHERE THE PROFILE HIGHLIGHTS

    // Clean Up
    [gregorian release];    

    return newDate;
}

【问题讨论】:

    标签: iphone memory-management memory-leaks profiling nsdate


    【解决方案1】:

    您不必释放-[NSCalendar dateFromComponents:] 返回的NSDate 对象。 我的猜测是该行被突出显示,因为它是您最后一次引用 components(希望是 NSDateComponents 的一个实例)并且您忘记释放 那个 对象。

    您的代码很好。当我运行静态分析器(而不是分析器)时,它不会报告任何错误。我不确定分析器为什么会报告泄漏——也许 Cocoa 框架中存在内部泄漏?

    【讨论】:

    • 哦 - 我现在已经把完整的方法放在帖子里了 - 基于这个你认为它会是 components 变量吗? (我没有使用 alloc 或 copy 生成它)
    • @Greg:我已经更新了我的答案。抱歉,我不能提供更多帮助。
    • 好的,谢谢 - 也许我会发布一个单独的重点问题,说明为什么探查器会突出显示此代码,如果它实际上是好的
    【解决方案2】:

    不,您不必释放它。它是自动发布的。

    【讨论】:

    • 只是想知道为什么探查器会向我突出显示这一行,汤姆我猜
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2016-10-20
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多