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 日間のウィンドウが経過した後、良い回答をした人には報奨金が与えられます。:-)