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日間のウィンドウが経過した後に報奨金を受けるでしょう。 :-)
もっと多くの構造を明らかにするより多くのコードが役に立つでしょう。 – hfossli