2

NSAttributedString からテキストのページをレンダリングする iPad アプリを構築しています。次のようなフレームセッターを作成します。

- (void)renderTextFromAttributedString:(NSAttributedString *)string
{
    CFAttributedStringRef attrString = (CFAttributedStringRef)string;
    framesetter = CTFramesetterCreateWithAttributedString(attrString);
    CFRelease(attrString);

...次に、コードは新しいページ ビューを 1 つずつ追加し、フレームセッター ポインターをそれぞれに渡し、文字がなくなるまで各ページをレンダリングします。

- (void)drawNewPage
{
    CTSinglePageView *newPage = [[CTSinglePageView alloc] initWithFrame:newFrame];
    newPage.delegate = self;
    [newPage renderWithFramesetter:framesetter fromIndex:currentIndex margins:self.margins];
    [self addSubview:newPage];
    [newPage release];
    currentPage ++;

...などなど。これですべてうまく機能し、ページがレンダリングされ、書式設定されたテキストが完全に表示されます。ただし、レンダリング プロセスの最後には、クリアが必要な CTFramesetter がまだ残っているので、次のページ セットを作成できます。しかし、もしそうなら

    if(framesetter) CFRelease(framesetter);

プロセスの最後に、CTFramesetter が (明らかに) 解放され、プログラムがクラッシュします! しかし... フレームセッターを解放しないと、最終的にかなり大きなメモリリークが発生し、プログラムが救済されます。

リリースによってクラッシュが発生するのはなぜですか? NSZombieEnabled をオンにすると、次のエラー メッセージが表示されます。

* -[NSConcreteAttributedString release]: 割り当て解除されたインスタンス 0xed20270 に送信されたメッセージ

もちろん、与えられた助けは大歓迎です!現在、ここで締め切りに迫っています。今すぐバウンティを追加できれば、そうします! 2 日間のウィンドウが経過した後、良い回答をした人には報奨金が与えられます。:-)

4

1 に答える 1

3

attrString を解放することになっていますか? それは正しくありません。それが後でフレームセッターをリリースするときにクラッシュを引き起こしているのだろうか。

于 2011-01-25T12:19:44.010 に答える