Почему я не могу выпустить свой CTFramesetter без сбоя приложения?


Я создаю приложение для 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-дневного окна. :-)

1 2

1 ответ:

Вы уверены, что должны выпустить attrString? Что-то тут не так. Я задаюсь вопросом, не является ли это причиной сбоя позже при выпуске framesetter.