0

我有一个返回给定日期的第一个工作日的小方法:

- (NSDate*) getFirstDayOfTheWeekFor:(NSDate*)date {

NSCalendar *gregorianCalender = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDate *firstDayDate; //This is 100.0% leaking acc. to the Performance Tool Leaks

unsigned yearAndWeek = NSYearCalendarUnit | NSWeekCalendarUnit;

// retrieve the components from the current date
NSDateComponents *compsCurrentDate = [[gregorianCalender components:yearAndWeek fromDate:date] autorelease];

[compsCurrentDate setWeekday:2]; // Monday
[compsCurrentDate setHour:0];
[compsCurrentDate setMinute:0];
[compsCurrentDate setSecond:0];

// make a date from the modfied components
firstDayDate = [[gregorianCalender dateFromComponents:compsCurrentDate] autorelease];   

return firstDayDate;
}

如您所见,我已经在尝试自动释放此处使用的每个变量(这不是我开始追踪泄漏之前的样子)。最初我想在返回之前显式释放所有变量,除了“firstDayDate”变量,因为返回必须自动释放。

这些是性能工具发现的泄漏对象:

  • icu::公历日历 (1.00 KB)
  • icu::SimpleTimeZone (112 字节)
  • __NSDate(16 字节)
  • icu::NSNumberingSystem (128 字节)
  • __NSCFCalendar (48 字节)

这个错误一定是完全愚蠢的,但我找不到。你能帮助我吗?谢谢你!!

4

1 回答 1

0

它应该如下所示:

- (NSDate*) getFirstDayOfTheWeekFor:(NSDate*)date
{
    NSCalendar *gregorianCalender = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDate *firstDayDate; //This is 100.0% leaking acc. to the Performance Tool Leaks

    unsigned yearAndWeek = NSYearCalendarUnit | NSWeekCalendarUnit;

    // retrieve the components from the current date
    NSDateComponents *compsCurrentDate = [gregorianCalender components:yearAndWeek fromDate:date];

    [compsCurrentDate setWeekday:2]; // Monday
    [compsCurrentDate setHour:0];
    [compsCurrentDate setMinute:0];
    [compsCurrentDate setSecond:0];

    // make a date from the modfied components
    firstDayDate = [gregorianCalender dateFromComponents:compsCurrentDate];

    return firstDayDate;
}

如果 firstDayDate 泄漏,则不在此方法中。检查下游。此外,对我来说,icu 部分看起来有点可疑。它可能是围绕 icu 库的 iOS 包装器中的错误/泄漏。

只记得你release或者autorelease如果你alloc, init,或者copy

于 2011-04-01T19:12:28.970 回答