我正在构建一个 iPad 应用程序,它从 NSAttributedString 呈现文本页面。我创建了一个这样的框架设置器:
- (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 release]:消息发送到释放实例 0xed20270
任何提供的帮助当然都会受到极大的欢迎!我们目前正面临截止日期,如果我现在可以添加赏金,我会的!在 2 天的窗口期过后,任何回答得好的人都将获得赏金奖励。:-)