Почему я не могу выпустить свой 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-дневного окна. :-)