2013-05-08 1 views
1

Код ниже отлично работает, я просто не знаю, куда должен идти релиз, потому что я не уверен, что это за правила. Я не использую ARC.Как использовать выпуск с переменной __block?

- (void)myFunc { 

    // stuff happens 

    __block UIImage* photo = [UIImage imageWithCGImage:croppedCGImage]; 

    [photo retain]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
             (unsigned long)NULL), ^(void) { 
     [self doStuffToPhoto:photo]; 
     // [photo release] causes EXC_BAD_ACCESS 
    }); 

    // [photo release] causes EXC_BAD_ACCESS in doStuffToPhoto 
} 

- (void)doStuffToPhoto:(UIImage*)photo { 
    // do stuff 
    // [photo release] causes EXC_BAD_ACCESS 
} 
+0

p.s. нет никакой причины использовать '__block' на' photo', так как 'photo' не назначается нигде – newacct

+0

размещение' [фото-релиза] 'в конце внутренней части блока' dispatch_async' не должно вызывать никаких проблем. Ваша проблема должна быть вызвана тем, что вы не показываете. – newacct

ответ

0

Если я понимаю документы прямо (ищите тип блока хранения и объектами и блоки Переменныеhere) , нет необходимости сохранять переменное фото: «__block переменных жить в хранилище, которое разделяется между лексической областью переменной и всеми блоками и блочными копиями, объявленными или созданными в лексической области переменной. Таким образом, хранилище сохранится при уничтожении фрейма стека, если сохранится какая-либо копия объявленных в кадре блоков за пределами рамки ".
Но это не объясняет, почему вы получаете EXC_BAD_ACCESS.

+0

Вы пропустили точку. * Variable * (указатель) живет на общем хранилище. * Объект, который он указывает на *, необходимо сохранить и отпустить. – newacct

+0

@newacct: Спасибо, что указали это. Во всяком случае, я не был полностью уверен («Если я правильно понимаю документы»). –

Смежные вопросы