Как устранить эти утечки? - PullRequest
2 голосов
/ 19 октября 2011

Я использую THCalendarInfo класс в моем приложении.В этом классе я получил утечки памяти, но на самом деле утечка показывает в этой строке CFCalendarCopyCurrent(),.На самом деле в методе dealloc он освобождается, но показывает утечки памяти.Я отправляю образец кода.

+ (int) currentDayOfWeek
{
    return CFCalendarGetOrdinalityOfUnit (
        CFCalendarCopyCurrent(),
        kCFCalendarUnitDay,
        kCFCalendarUnitWeek,
    [self currentAbsoluteTime]
    );
}

- (id) init
{
    [super init];
    _absoluteTime = CFAbsoluteTimeGetCurrent();
    _calendar     = CFCalendarCopyCurrent();
    _timeZone     = CFCalendarCopyTimeZone( _calendar );
    _dayNames     = nil;
    _monthNames   = nil;

    [self setupEnglishNames];
    return self;
}

- (void) dealloc
{
    if ( _calendar ) CFRelease( _calendar );
    if ( _timeZone ) CFRelease( _timeZone );

    [_dayNames release];
    [_monthNames release];

    [super dealloc];
}

Ответы [ 2 ]

4 голосов
/ 19 октября 2011

Ваша утечка памяти в методе + (int) currentDayOfWeek, потому что вы создаете еще одну копию логического календаря. Попробуйте использовать существующий календарь вместо создания нового.

1 голос
/ 20 марта 2012

Это работает для меня во всех методах этого контроллера

Необходимо только освободить текущий календарь перед возвратом индекса.

+ (int) currentDayOfWeek
{
    CFCalendarRef currentCalendar = CFCalendarCopyCurrent ();

    CFIndex respuesta = CFCalendarGetOrdinalityOfUnit (
                                           currentCalendar,
                                           kCFCalendarUnitDay,
                                           kCFCalendarUnitWeek,
                                           [self currentAbsoluteTime]
                                           );
    CFRelease(currentCalendar);

    return respuesta;
}

+ (int) daysInCurrentMonth
{
    CFCalendarRef currentCalendar = CFCalendarCopyCurrent ();

    CFRange r = CFCalendarGetRangeOfUnit (
       currentCalendar,
       kCFCalendarUnitDay,
       kCFCalendarUnitMonth,
       [self currentAbsoluteTime]
    );


    CFRelease(currentCalendar);

    return r.length;
}
...