2011-04-01 1 views
0

Я имею небольшой метод, возвращающий первый день недели для определенной даты:Утечка памяти с датой Материала (__NSCFCalendar СИС :: GregorianCalendar)

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

Как вы можете видеть, я уже пытался autorelease каждая переменная, которая используется здесь (это не то, что было похоже, прежде чем я начал отслеживать утечки). Первоначально я хотел явно освободить все переменные перед возвратом, за исключением переменной «firstDayDate», которая должна быть автореализована из-за возврата.

Это просочились объекты, найденные Performance Tool:

  • СИС :: GregorianCalendar (1,00 KB)
  • СИС :: SimpleTimeZone (112 байт)
  • __NSDate (16 байт)
  • СИС :: NSNumberingSystem (128 байт)
  • __NSCFCalendar (48 байт)

Ошибка ДОЛЖНА быть чем-то совершенно глупым, но я не могу ее найти. Вы можете мне помочь? СПАСИБО!!

ответ

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 выглядит немного подозрительно для меня. Это может быть ошибка/утечка в оболочке iOS вокруг библиотеки icu.

Помните, что вы всего лишь release или autorelease, если вы alloc, init, или copy.

+0

Да, часть icu выглядит для меня подозрительно .. спасибо за ваш быстрый ответ, надеюсь, кто-то еще может теперь сказать, что это все об этих объектах icu. –

+0

Также просмотрите любой из ваших кодов, который вызывает этот метод. Скорее всего, он сохранит ценность и не выпустят, и моя догадка будет устанавливать его в собственность где-то, которая не была должным образом выпущена. Как сказал Amattn, ваша утечка не существует в этом коде. – Joe