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

Я создаю приложение для iPad, которое отображает страницы текста из NSAttributedString. Я создаю framesetter, как это:

- (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 освобождается (очевидно), и программа вылетает! НО ... Если я не освобождаю framesetter, я в конечном итоге получаю довольно большие утечки памяти, и программа выручает.

Почему релиз вызывает сбой? При включенном NSZombieEnabled появляется сообщение об ошибке:

* - [выпуск NSConcreteAttributedString]: сообщение отправлено освобожденному экземпляру 0xed20270

Любая предоставленная помощь, конечно же, получена! У нас сейчас крайний срок, если бы я мог добавить щедрость сейчас, я бы! Любой, у кого есть хороший ответ, получит вознаграждение по истечении 2-дневного окна. : -)

1 Ответ

3 голосов
/ 25 января 2011

Вы уверены, что должны выпустить attrString? Это не выглядит правильно. Интересно, это вызвало сбой позже при выпуске framesetter.

...