2011-10-19 14 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()にも2つありますが、クラスメソッドのものはおそらく解放されていないので、おそらく候補です。 – 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; 
} 
関連する問題