【问题标题】:Core Foundation Memory Leak核心基础内存泄漏
【发布时间】:2013-09-12 23:06:10
【问题描述】:

对于这段代码:

        CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)self.fontName, self.paragraphSpacing, NULL);
        [self.text insertAttributedString: [[NSAttributedString alloc] initWithString: @" \n"  attributes: [NSDictionary dictionaryWithObjectsAndKeys: (__bridge id)font, (id)kCTFontAttributeName, (id)[self paragraphStyle], (id)kCTParagraphStyleAttributeName, nil]] atIndex: 0];
        [self.text appendAttributedString: [[NSAttributedString alloc] initWithString: @"\n "  attributes: [NSDictionary dictionaryWithObjectsAndKeys: (__bridge id)font, (id)kCTFontAttributeName, (id)[self paragraphStyle], (id)kCTParagraphStyleAttributeName, nil]]];
        CFRelease(font);

对于中间两行来说,“潜在的对象泄漏”但我并没有真正看到问题所在。

我应该提到静态分析器指向[self paragraphStyle],即:

- (CTParagraphStyleRef) paragraphStyle
{
    CTTextAlignment alignment = self.alignment;
    CGFloat lineSpacing = self.lineSpacing;
    CGFloat firstLineHeadIndent = self.indent;
    CGFloat headIndent = self.indent;
    CGFloat tailIndent = -self.indent;

    CTParagraphStyleSetting paragraphSettings[] =
    {
        {kCTParagraphStyleSpecifierAlignment, sizeof(alignment), &alignment},
        {kCTParagraphStyleSpecifierLineSpacing, sizeof(lineSpacing), &lineSpacing},
        {kCTParagraphStyleSpecifierFirstLineHeadIndent, sizeof(firstLineHeadIndent), &firstLineHeadIndent},
        {kCTParagraphStyleSpecifierHeadIndent, sizeof(headIndent), &headIndent},
        {kCTParagraphStyleSpecifierTailIndent, sizeof(tailIndent), &tailIndent},
    };

    return CTParagraphStyleCreate(paragraphSettings, 5);
}

【问题讨论】:

  • 你必须释放那些CGParagraphStyleCreate 调用的结果。将它们检索到局部变量中,在属性字符串调用中使用它们,然后CFRelease 它们。归根结底,任何名称中带有 Copy 或 Create 的 Core Foundation 调用都会返回一个您必须显式释放的 Core Foundation 对象。

标签: iphone ios cocoa-touch cocoa core-foundation


【解决方案1】:

编辑后变得清晰。你的方法是创建段落样式,而这些样式永远不会发布

a) 应该重命名该方法,以便更清楚地知道它创建了新对象

b) 你必须 CFR 释放它们

什么就够了:

CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)self.fontName, self.paragraphSpacing, NULL);
assert(font); //may not be nil
CTParagraphStyleRef paragraph = self.paragraphStyle;
assert(paragraph); //may not be nil
[self.text insertAttributedString: [[NSAttributedString alloc] initWithString: @" \n"  attributes: [NSDictionary dictionaryWithObjectsAndKeys: (__bridge id)font, (id)kCTFontAttributeName, (id)paragraph, (id)kCTParagraphStyleAttributeName, nil]] atIndex: 0];
[self.text appendAttributedString: [[NSAttributedString alloc] initWithString: @"\n "  attributes: [NSDictionary dictionaryWithObjectsAndKeys: (__bridge id)font, (id)kCTFontAttributeName, (id)paragraph, (id)kCTParagraphStyleAttributeName, nil]]];
CFRelease(font);
CFRelease(paragraph); //!!!

*断言是奖励

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 2011-01-05
    • 2011-09-19
    • 2013-07-29
    • 1970-01-01
    • 2015-11-05
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多