为什么我不能在没有应用程序崩溃的情况下发布我的CTFramesetter?

时间:2010-11-24 15:27:11

标签: ipad memory-management ios nsattributedstring core-text

我正在构建一个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天窗口过后获得奖励。: - )

1 个答案:

答案 0 :(得分:3)

你确定你应该发布attrString吗?这看起来不对。我想知道在释放framesetter时是否会导致崩溃。