如何释放这些泄漏?

时间:2011-10-19 07:28:14

标签: iphone objective-c ios memory-leaks

我在我的应用程序中使用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 个答案:

答案 0 :(得分:4)

您的内存泄漏是+ (int) currentDayOfWeek方法,因为您创建了逻辑日历的另一个副本。尝试使用现有日历而不是创建新日历。

答案 1 :(得分:1)

这适用于此控制器的所有方法

只需在返回索引之前释放当前日历。

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