2011-08-16 7 views
1

私は追跡できないリークがあります。私はCoreText(そして一般的にはC)を初めて使っていますので、優しくしてください!静的アナライザは、何の問題も表示されませんが、楽器はこの方法で行います。CoreTextを使用したUIView drawRectのリーク

- (void)drawAttributedStringInBubbleInContext:(CGContextRef)context { 
    static CGFloat const kTextInset = 10; 

    // Add the text to the bubble using an ellipse path inside the main speech bubble if the text property is set 
    if (text) { 

     // Create an attributed string from the text property 
     NSMutableAttributedString *bubbleText = [[NSMutableAttributedString alloc] initWithString:text];   

     // Justify the text by adding a paragraph style 
     CFIndex stringLength = CFAttributedStringGetLength((CFAttributedStringRef)bubbleText); 
     CTTextAlignment alignment = kCTJustifiedTextAlignment; 
     CTParagraphStyleSetting _settings[] = { 
      {kCTParagraphStyleSpecifierAlignment, sizeof(alignment), &alignment} 
     };  
     CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(_settings, sizeof(_settings)/sizeof(_settings[0])); 
     CFRange stringRange = CFRangeMake(0, stringLength); 
     CFAttributedStringSetAttribute((CFMutableAttributedStringRef)bubbleText, stringRange, kCTParagraphStyleAttributeName, paragraphStyle); 
     CFRelease(paragraphStyle);  

     // Layout the text within an elliptical frame 
     CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)bubbleText); 

     // Create elliptical path that is inset from the frame of the view 
     CGMutablePathRef path = CGPathCreateMutable(); 
     CGRect drawingRect = self.bounds; 
     drawingRect.origin.x = kTextInset; 
     drawingRect.origin.y = kTextInset; 
     drawingRect.size.width -= 2 * kTextInset; 
     drawingRect.size.height -= 2 * kTextInset; 
     CGPathAddEllipseInRect(path, NULL, drawingRect); 

     // Create a text frame from the framesetter and the path 
     CTFrameRef textFrame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0), path, NULL); 

     // Draw the text frame in the view's graphics context 
     CTFrameDraw(textFrame, context); 

     // Clean up 
     CGPathRelease(path); 
     CFRelease(framesetter); 
     [bubbleText release]; 
    } 
} 

私はきちんとすべてをリリースしてきたと思ったが、楽器に応じた主犯は、CTFrameRef textFrame =ラインです。

答えて

1

それが原因で、Core Foundation rule for Createの方法はそれらを解放する必要があります。 AppleはCore Text Programming Guideの例で正しくリリースしています。

// Clean up 
    CGPathRelease(path); 
    CFRelease(framesetter); 
    CFRelease(textFrame); 
+0

ありがとう。治療をしました。私はこれを逃したとは信じられません。クイックレスポンス、推論、余分なリンクを気に入ってください。乾杯。 –

関連する問題