Как устранить эти утечки?

#iphone #objective-c #ios #memory-leaks

#iPhone #objective-c #iOS #утечки памяти

Вопрос:

Я использую 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];
}
  

Комментарии:

1. У CFCalendarCopyCurrent() вас там два, один в вашем методе класса, вероятно, является кандидатом, поскольку он не выпущен.

2. я перехожу по этой ссылке Класс pastebin.com/XiYkKfC2

Ответ №1:

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

Ответ №2:

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

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

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