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