Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 物体潜在泄漏_Ios_Objective C_Memory Leaks - Fatal编程技术网

Ios 物体潜在泄漏

Ios 物体潜在泄漏,ios,objective-c,memory-leaks,Ios,Objective C,Memory Leaks,有什么能帮助我理解为什么我在运行analyze时遇到这个问题 我有一个存储在“oldShadowPath”中的对象的潜在泄漏 这是因为您没有对应于每个CFRetain的CFRelease。您在双“if”语句中释放对象,其中一个独立于保留条件(“oldShadowPath”)。正如@H2CO3所评论的那样,如果持续时间为0,则永远不会释放oldShadowPath。如果持续时间为0,则永远不会释放oldShadowPath。谢谢。问题是我试图添加一个else语句来处理duration==0。使用e

有什么能帮助我理解为什么我在运行analyze时遇到这个问题

我有一个存储在“oldShadowPath”中的对象的潜在泄漏


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

正如@H2CO3所评论的那样,如果
持续时间
为0,则永远不会释放
oldShadowPath

如果
持续时间
为0,则永远不会释放
oldShadowPath
。谢谢。问题是我试图添加一个else语句来处理duration==0。使用
else{CFRelease(oldShadowPath);}
但是我对CFRelease进行了空指针调用。是的,您还应该检查'oldShadowPath'中的nil。为什么不在那些ifs之外释放它,并且只检查if(oldShadowPath)?编辑:或者更好:您可能可以为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);
        }
    }
}