我正在构建一个iPad应用程序,用于呈现NSAttributedString中的文本页面。我创建了一个像这样的框架集:
- (void)renderTextFromAttributedString:(NSAttributedString *)string
{
CFAttributedStringRef attrString = (CFAttributedStringRef)string;
framesetter = CTFramesetterCreateWithAttributedString(attrString);
CFRelease(attrString);
...然后代码逐个添加新的页面视图,并将框架集指针传递给每个页面以呈现每个页面,直到没有剩下的字符为止:
- (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天窗口过后获得奖励。: - )
答案 0 :(得分:3)
你确定你应该发布attrString吗?这看起来不对。我想知道在释放framesetter时是否会导致崩溃。