Проблемы с потоками, блоками, 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 может не работать?

Спасибо Джо


person Joe Andolina    schedule 25.06.2013    source источник


Ответы (1)


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

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

person newacct    schedule 26.06.2013
comment
Спасибо за ответ. Добавление typedef и свойства уровня класса помогло. typedef __attribute__((NSObject)) CGImageRef RenderedImageRef; @property (strong, nonatomic) RenderedImageRef renderedImage; Приятного программирования, Джо - person Joe Andolina; 27.06.2013