0

У меня есть программа, в которой я настраивал блок завершения, который работает на фоновом потоке. Внутри блока я создал CGImageRef, а затем в основном потоке установил содержимое моего слоя. Проблема в том, что иногда приложение падает на часть основного потока.Проблемы с потоками, блоки, CGImageRef и область

Это блок завершения, в коде ниже как fullImage и cfFullImage объявлены в моей .h

requestCompleteBlock completionBlock = ^(id data) 
{ 
    // Seems I need to hold onto the data for use later 
    fullImage = (NSImage*)data; 
    NSRect fullSizeRect = NSMakeRect(0, 0, self.frame.size.width, self.frame.size.height); 

    // Calling setContents with an NSImage is expensive because the image has to 
    // be pushed to the GPU first. So, pre-emptively push it to the GPU by getting 
    // a CGImage instead. 
    cgFullImage = [fullImage CGImageForProposedRect:&fullSizeRect context:nil hints:NULL]; 

    // Rendering needs to happen on the main thread or else crashes will occur 
    [self performSelectorOnMainThread:@selector(displayFullSize) withObject:nil waitUntilDone:NO]; 
}; 

В последней строке моего завершения блока является вызов displayFullSize. Эта функция ниже.

- (void)displayFullSize 
{ 
    [self setContents:(__bridge id)(cgFullImage)]; 
} 

Вы видите или знаете причину, по которой может произойти сбой setContents?

Благодаря Джо

ответ

3

cgFullImage не сохраняется. Объект Core CGImage Foundation освобожден, и вы используете освобожденный объект.

Основные типы указателей объекта Core, такие как CGImageRef, не управляются ARC. Вы должны либо аннотировать переменную экземпляра с помощью __attribute__((NSObject)), либо изменить тип переменной экземпляра на тип указателя объекта Objective-C, например id.

+0

Спасибо за ответ. Добавление типа typedef и свойства уровня класса сделало трюк. 'typedef __attribute __ ((NSObject)) CGImageRef RenderedImageRef; @property (сильный, неатомный) RenderedImageRef renderedImage; ' Happy code, Joe –