Iphone 处理CGMutablePath时内存泄漏

Iphone 处理CGMutablePath时内存泄漏,iphone,ios,cocoa-touch,core-graphics,Iphone,Ios,Cocoa Touch,Core Graphics,在以下情况下使用CGMutablePath时,我出现内存泄漏: - (CGMutablePathRef) textMutablePathForFrame:(CGRect)frame { CGAffineTransform transform = CGAffineTransformMakeScale(frame.size.width / self.shapeMutablePathSize.width, frame.size.height / self.shapeMutablePathSiz

在以下情况下使用
CGMutablePath
时,我出现内存泄漏:

- (CGMutablePathRef) textMutablePathForFrame:(CGRect)frame
{
    CGAffineTransform transform = CGAffineTransformMakeScale(frame.size.width / self.shapeMutablePathSize.width, frame.size.height / self.shapeMutablePathSize.height);

    return CGPathCreateMutableCopyByTransformingPath(self.shapeMutablePath, &transform);
}

- (CTFrameRef) textFrameForFrame:(CGRect)frame framesetter:(CTFramesetterRef)framesetter
{
    CGMutablePathRef textMutablePath = [self textMutablePathForFrame:frame];
    CTFrameRef textFrame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), textMutablePath, NULL);
    CGPathRelease(textMutablePath);

    return textFrame;
}
通过仪器分析,我在
textMutablePathForFrame
中带有“
return
”的行中得到内存泄漏,该行表示“第132行上分配的对象的潜在泄漏”(第132行是返回行本身)

我还在
textFrameForFrame
中的“
cgpathlease(textMutablePath);
”行中发现内存泄漏,该行表示:“调用方此时不拥有的对象的引用计数减少错误”

我无法理解这一点,感觉我终于对Core中的内存管理有了很好的理解



更新:看起来这可能是一个bug,将再次撞击它,看看是否有其他人感觉不一样。

我认为您没有内存泄漏,请将
textMutablePathForFrame
方法名称更改为
createMutablePathForFrame
,警告应该会消失。

我认为您没有内存泄漏,将
textMutablePathForFrame
方法名称更改为
createMutablePathForFrame
,警告应消失。

@JonathanCichon原则上是正确的,但命名约定错误。ObjC方法的正确命名约定是
newMutablePathForFrame
。分析仪是正确的。“创建”规则只适用于核心基础。ObjC命名约定在中。核心基础规则略有不同,包括“创建”规则,在.

@ JonathanCichon原则上是正确的,但有错误的命名约定。ObjC方法的正确命名约定是

newMutablePathForFrame
。分析仪是正确的。“创建”规则只适用于核心基础。ObjC命名约定在中。核心基础规则略有不同,包括“创建”规则,在.< /p>中,您是否从代码函数?@ H2CO3-返回的对象?然后我将一个属性设置为该本地CTFontRef,然后释放本地CTFontRef。@H2CO3-认为这可能是一个bug吗?@H2CO3-感谢您的输入。请注意下面的评论。分析仪正确;这不是一个bug。名称应该是
newMutablePathForFrame
。您是否
CFRelease()
调用函数返回的对象?@H2CO3-是的,我刚刚检查过,在所有情况下,当我调用textMutablePathForFrame时,我通常将其存储在本地CTFrontRef中,然后我将属性设置为该本地CTFontRef,然后我发布了本地的CTFontRef。@H2CO3-觉得可能是个bug吗?@H2CO3-谢谢你的输入。注意下面的评论。分析仪正确;这不是一个bug。名称应该是
newMutablePathForFrame
。Jon这只是一个命名约定,更改我的方法的名称不会有任何效果。@CoDEFRo是否释放调用方返回的对象?分析器使用命名约定打印警告或不打印警告。在方法中创建并返回新对象时,xcode假定存在内存泄漏。另外,xcode假定您正在使用
cgpathlease(textMutablePath)
释放一个不属于您的对象。要向xcode提示您正在做什么,您必须遵循命名约定,或者忽略警告。看起来命名约定仅适用于coreFoundation,而不适用于objective-c。有两种解决方案可以消除这些警告:编写一个c函数并使用self作为第二个参数
CGMutablePathRef createMutablePathForFrame(CGRect path,YourClass self)
,或者将路径包装在
UIBezierPath
中,这样它就会被自动删除。@JonathanCichon-听起来你认为这是苹果的一个bug?顺便说一句,谢谢您的输入。Jon这只是一个命名约定,更改我的方法的名称不会有任何效果。@CoDEFRo您是否释放调用方返回的对象?分析器使用命名约定打印警告或不打印警告。在方法中创建并返回新对象时,xcode假定存在内存泄漏。另外,xcode假定您正在使用
cgpathlease(textMutablePath)
释放一个不属于您的对象。要向xcode提示您正在做什么,您必须遵循命名约定,或者忽略警告。看起来命名约定仅适用于coreFoundation,而不适用于objective-c。有两种解决方案可以消除这些警告:编写一个c函数并使用self作为第二个参数
CGMutablePathRef createMutablePathForFrame(CGRect path,YourClass self)
,或者将路径包装在
UIBezierPath
中,这样它就会被自动删除。@JonathanCichon-听起来你认为这是苹果的一个bug?顺便说一句,谢谢你的意见。