CTFontRef引起的内存泄漏

时间:2013-02-04 13:15:35

标签: ios memory-leaks ctfontref

我使用以下代码生成PDF但是导致内存泄漏可以有人帮忙吗? 代码如下。

- (void)drawText:(NSString*)textToDraw inFrame:(CGRect)frameRect {


    NSMutableAttributedString *string = [[[NSMutableAttributedString alloc]
                                         initWithString:textToDraw] autorelease];

    // make a few words bold

    CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica-Bold"), 8.0, NULL);

    [string addAttribute:(id)kCTFontAttributeName
                   value:(id)helveticaBold
                   range:NSMakeRange(0, [string length])];

    // add some color.
    if (_flag == 1) {

        [string addAttribute:(id)kCTForegroundColorAttributeName
                       value:(id)[UIColor whiteColor].CGColor
                       range:NSMakeRange(0, [string length])];


    } else {

        [string addAttribute:(id)kCTForegroundColorAttributeName
                       value:(id)[UIColor blackColor].CGColor
                       range:NSMakeRange(0, [string length])];
    }

    // layout master
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string);

    CGMutablePathRef framePath = CGPathCreateMutable();
    CGPathAddRect(framePath, NULL, frameRect);

    // Get the frame that will do the rendering.
    CFRange currentRange = CFRangeMake(0, 0);
    CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL);
    CGPathRelease(framePath);

    // Get the graphics context.
    CGContextRef    currentContext = UIGraphicsGetCurrentContext();

    // Put the text matrix into a known state. This ensures
    // that no old scaling factors are left in place.
    CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);
    CGContextSetRGBFillColor(currentContext, 0, 0, 0, 1.0);

    // Core Text draws from the bottom-left corner up, so flip
    // the current transform prior to drawing.
    CGContextTranslateCTM(currentContext, 0, frameRect.origin.y*2);
    CGContextScaleCTM(currentContext, 1.0, -1.0);

    // Draw the frame.
    CTFrameDraw(frameRef, currentContext);

    CGContextScaleCTM(currentContext, 1.0, -1.0);
    CGContextTranslateCTM(currentContext, 0, (-1)*frameRect.origin.y*2);

    CFRelease(frameRef);
    //CFRelease(stringRef);
    CFRelease(framesetter);

}

我在生成

时多次调用此函数

PDF,每次都会导致内存泄漏。

1 个答案:

答案 0 :(得分:6)

CTFontCreateWithName遵循create-name-rule,如果你创建它,你拥有它,你必须在你完成后释放它:

CFRelease(helveticaBold);