0

この単純なコードがメモリリークを引き起こすことがある理由はわかりません(常にではありません)。

このコードはNSOperationにラップされ、NSOperationQueueキューで実行されます。この操作は、sourceNSAStringをトリミングしてサイズに合わせ、結果として他のスレッドに返します。

//sourceNSAString is a NSMutableAttributedString that will be set to nil elsewhere in another GCD queue.
CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) sourceNSAString); 

if (frameSetter) {

    CFRange fitRange = {static_cast<CFIndex>(range.location), 0};

    CFRange totalRange = {static_cast<CFIndex>(range.location), static_cast<CFIndex>(range.length)};

    CGSize suggestedSize = CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, totalRange, NULL, size, &fitRange);

    CFRelease(frameSetter);

      ...... trim sourceNSAString to fit in fitRange
 }

それは次の理由によるものです:1、sourceNSAStringを別のスレッドに返すべきではありませんか?または2、CTFramesetterCreateWithAttributedStringはバックグラウンドスレッドで使用できませんか?

何か案は?ありがとう!

4

3 に答える 3

0

OK、それはシミュレーターのバグのようです(少なくとも今のところ)。デバイスでアプリのプロファイルを作成しましたが、メモリリークがなくなりました。マルチスレッド環境でコアテキストを使用すると、シミュレータに多くのメモリリークが発生するようです。たとえば、CTFrameSetterを作成し、後で同じGCDシリアルキューでリリースすると(ドキュメントで許可されています)、メモリリークがランダムに発生する可能性があります。とにかく、実際のデバイスでプロファイルを作成すると、これらのメモリリークはすべて解消されます。

于 2012-07-22T17:45:05.610 に答える
0

このリークは単なるシミュレータのバグではなく、実際のデバイスに現れます。詳細なデバッグについては、この関連する質問に対する私の回答を参照してください。メモリ使用量はCTFontCreateWithNameおよびCTFramesetterRefで増加します。

于 2013-06-24T19:55:00.920 に答える
-2

ifステートメントが実行されない場合、frameSetterは解放されないため、ifステートメントの後にframeSetterを解放する必要があると思います。

    CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) sourceNSAString); 

if (frameSetter) {

    CFRange fitRange = {static_cast<CFIndex>(range.location), 0};

    CFRange totalRange = {static_cast<CFIndex>(range.location), static_cast<CFIndex>(range.length)};

    CGSize suggestedSize = CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, totalRange, NULL, size, &fitRange);

 }

CFRelease(frameSetter);

これはうまくいくはずです

于 2012-07-16T10:37:49.940 に答える