2010-11-24 11 views
2

NSAttributedStringからテキストのページをレンダリングするiPadアプリを構築しています。文字がないまで、コードでは、新しいページビュー、一つずつ追加し、各ページをレンダリングするために各1を切っframesetterポインタを渡す...なぜアプリケーションがクラッシュせずにCTFramesetterをリリースできないのですか?

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

左:私はこのようなframesetterを作成します。

- (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リリース]:大幅受信割り当て解除インスタンスに送信されたメッセージが0xed20270

与えられた任意の助けをもちろんです!私は現在、賞金を追加することができれば、今ここで期限を迎えています! 良い答えを持つ人は、2日間のウィンドウが経過した後に報奨金を受けるでしょう。 :-)

+0

もっと多くの構造を明らかにするより多くのコードが役に立つでしょう。 – hfossli

答えて

3

attrStringをリリースする予定ですか?それは正しく見えません。後でフレームセッターをリリースするときにクラッシュを引き起こしているのだろうかと思います。

+0

あなたは絶対に正しいです。申し訳ありませんが、私は戻ってチェックしなければならなかった、この質問は数ヶ月前に尋ねられました。私はそれを閉じるのを忘れました!はい...私はそれを保持していなかったので、attrStringはリリースされていないはずです。アプリはその後投稿され承認されました:-)しかし、助けてくれてありがとう! – jowie

関連する問題