Memory Leak When Handling CGMutablePath
在以下情况下使用CGMutablePath时发生内存泄漏:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| - (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行" CGPathRelease(textMutablePath); "处也出现内存泄漏,它说:"调用者此时不拥有的对象的引用计数错误地减少了"。
无法解决这个问题,感觉就像我终于对Core中的内存管理有了很好的了解。
更新:看起来这可能是一个错误,将再次碰碰它一次,看看是否还有其他人有不同的感觉。
- 您是否CFRelease()从调用函数返回的对象?
-
@ H2CO3-是的,我刚刚检查了一下,在所有情况下,当我调用textMutablePathForFrame时,通常将其存储在本地CTFrontRef中,然后将属性设置为该本地CTFontRef,然后释放该本地CTFontRef。
-
@ H2CO3-认为这可能是一个错误吗?
-
@ H2CO3-感谢您的输入。
-
请注意以下注释。分析仪是正确的;这不是错误。名称应为newMutablePathForFrame。
-
@RobNapier-谢谢罗伯,那很奏效,我很震惊,从来没有想过。您想把它作为答案吗?另外,我想知道,您是否为iPhone提供咨询服务,尤其是在CoreText领域?我有您的书,正在寻找您的联系信息,但找不到。
-
是的;我的地址是[email protected]。
@JonathanCichon原则上是正确的,但是命名约定错误。 ObjC方法的正确命名约定是newMutablePathForFrame。分析仪是正确的。"创建"规则仅适用于Core Foundation。 ObjC命名约定在《高级内存管理编程指南》中。 Core Foundation规则稍有不同,其中包括"创建"规则,位于Core Foundation的内存管理编程指南中。
我认为您没有内存泄漏,请将您的textMutablePathForFrame方法名称更改为createMutablePathForFrame,并且警告会消失。
- 乔恩(Jon)只是一个命名约定,更改方法的名称将无法完成任何事情。
-
@CoDEFRo您是否CFRelease()从调用方返回的对象?
-
分析仪使用命名约定打印或不打印警告。在您清楚地在方法中创建并返回一个新对象时,xcode假定存在内存泄漏。另外,xcode假定您释放的对象不是CGPathRelease(textMutablePath)所拥有的。为了给xcode一个提示,你必须遵循命名约定,或者只是忽略警告。
-
看起来命名约定仅适用于coreFoundation而不适用于Objective-c。消除警告的两种解决方案:编写c函数并将self作为第二个参数CGMutablePathRef createMutablePathForFrame(CGRect path, YourClass self)或将路径package在UIBezierPath中,以便将其通过ARC / Autorelease处理。
-
@JonathanCichon-听起来您认为这是Apple的错误?顺便说一句谢谢您的输入。
-
是的,我认为分析仪做错了什么。您可以编写一个包含许多迭代的循环,并检入工具中是否存在泄漏,但是请确保这两个函数很好。
-
@JonathanCichon原则上是正确的,但是命名约定错误。 ObjC方法的正确命名约定是newMutablePathForFrame。分析仪是正确的。"创建"规则仅适用于Core Foundation。 ObjC命名约定在此处:developer.apple.com/library/mac/#documentation/Cocoa/Concept ?? ual /…。