2011-10-19 29 views
2

我在我的应用程序中使用了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]; 
} 
+0

其中'CFCalendarCopyCurrent()',你有两个,你的类方法中的一个可能是候选人,因为它没有发布。 – jrturton

+0

我关注此链接类http://pastebin.com/XiYkKfC2 –

回答

4

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

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