2013-11-02 4 views
1

Может ли кто-нибудь помочь мне понять, почему я получаю эту проблему при запуске анализа?Потенциальная утечка объекта

У меня есть потенциальная утечка объекта, хранящегося в «oldShadowPath».

-(void) layoutShadowWithDuration:(NSTimeInterval)duration 
{ 
    CGPathRef oldShadowPath = self.mainViewController.view.layer.shadowPath; 

    if (oldShadowPath) 
    { 
     CFRetain(oldShadowPath); 
    } 

    // Update shadow path for the view 
    CGPathRef path = [UIBezierPath bezierPathWithRect:self.mainViewController.view.bounds].CGPath; 
    self.mainViewController.view.layer.shadowPath = path; 

    // You would think setting duration to 0 would cause the animation added below to not animate. You would be wrong. 
    if (duration != 0) { 
     if (oldShadowPath) 
     { 
      [self.mainViewController.view.layer addAnimation:((^ { 
       CABasicAnimation *transition = [CABasicAnimation animationWithKeyPath:@"shadowPath"]; 
       transition.fromValue = (__bridge id)oldShadowPath; 
       transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
       transition.duration = duration; 
       return transition; 
      })()) forKey:@"transition"]; 

      CFRelease(oldShadowPath); 
     } 
    } 
} 
+5

Если 'duration' равно 0, тогда' oldShadowPath' никогда не будет выпущен. –

ответ

1

Это потому, что у вас нет CFRelease, соответствующего каждому CFRetain. Вы отпускаете объект в двойном выражении «if», где один из них не зависит от условия сохранения («oldShadowPath»).

+0

Спасибо за это. Проблема в том, что я попытался добавить инструкцию else, чтобы позаботиться о длительности == 0. с 'else {CFRelease (oldShadowPath);}', но тогда у меня был нулевой указатель на вызов CFrelease. –

+0

Да, вы должны также проверить «oldShadowPath» на ноль. Почему бы просто не освободить его за пределами ifc и проверить только если (oldShadowPath)? Изменить: или, может быть, лучше: вы, вероятно, можете разделить логику на случай oldShadowPath. И если вам не нужно ничего делать, когда он равен нулю, вы можете просто проверить его в первой строке и вернуться в случае нуля. –

-1

Как @ H2CO3 прокомментировал, если duration равно 0, то oldShadowPath никогда не выпускается.

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