2013-11-02 117 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'永远不会被释放。 – 2013-11-02 01:07:55

回答

1

这是因为你没有对应于每个CFRetain的CFRelease。您可以在双'if'语句中释放对象,其中一个语句与保留条件(“oldShadowPath”)无关。

+0

谢谢你。问题是我尝试添加一个else语句来处理持续时间== 0.用else {CFRelease(oldShadowPath);}'但是然后我有空指针调用CFrelease。 –

+0

是的,你也应该检查'oldShadowPath'为零。为什么不只是在这些ifs之外发布它,并只检查(oldShadowPath)?编辑:或者更好:你可能可以为oldShadowPath情况分开逻辑。如果你在零时不需要做任何事情,你可以在第一行检查,如果没有,就返回。 –

-1

As @ H2CO3评论说,如果duration为0,那么oldShadowPath永远不会被释放。