2010-11-11 2 views
2

У меня есть класс одноплодного и линия в утечке памяти причины метода инициализации, и я не kwno почему ...Утечка памяти с одноплодной

это моя реализация

static timerController *sngTimer = nil; 

@implementation timerController 

@synthesize repeatingTimer; 
@synthesize dateComp; 
@synthesize bPause; 

+(timerController *) singletonTimer 
{ 
    @synchronized(self){ 
     if (sngTimer == nil) 
     { 
      sngTimer = [[timerController alloc]init]; 
     } 
    } 

    return sngTimer; 
} 

-(id)init 
{ 
    self = [super init]; 

    if (self != nil) { 

     dateComp = [[NSDateComponents alloc] init];   ///this line cause memory leak 
     NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; ///this line cause memory leak 

     [dateComp setCalendar:gregorianCalendar]; ///this line cause memory leak 

     [gregorianCalendar release]; 

     bPause = FALSE; 
    } 

    return self; 
} 
+0

Можете ли вы отметить синглтон как автореферат в Objective-C? Не могли бы вы отпустить его в чем-то вроде C 'atexit()' handler? –

+0

- свойство dateComp объявлено как «сохранить» или «скопировать»? Если это так, вы протекаете NSDateComponents –

+0

dateComp объявлен удержанием – alex

ответ

3

Я не знаю, как вы обнаруживаете утечку, но, скорее всего, какой бы инструмент вы ни использовали, что у вас нет метода dealloc для выпуска объекта, который вы там создаете. Вероятно, вы должны иметь это для полноты, но пока класс используется только как одноэлементный, это не имеет большого значения.

+0

Я обнаруживаю утечку с помощью средства измерения утечки – alex

2

Это не утечка. Синглтон остается навсегда (обычно), поэтому предположил, что останется в памяти.

1

Chuck's answer правильный. Внесите метод -dealloc, и внутри него установите для свойства dateComp значение nil или отпустите соответствующий ivar. -dealloc никогда не будет вызван, но он заткнет статический анализатор.

Вот хорошая статья о некоторых из subtleties of singletons.

Смежные вопросы