EXC_BAD_ACCESS при копировании или сохранении блока

Насколько я понимаю, блок действует как объект, в том смысле, что вы можете отправлять ему сообщения копирования или выпуска, например:

[myBlock copy];

Однако всякий раз, когда я это делаю или освобождаю блок, я получаю EXC_BAD_ACCESS.

Если я использую функции блока, все работает так, как ожидалось, например:

Block_copy(myBlock);

Я думал, что оба способа выпуска и копирования блоков идентичны?

Это не такая большая проблема, но немного раздражает то, что если у меня есть свойство (копия), которое является блоком, мне приходится самому писать метод установки.

Например: со свойствами:

//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);

//Implementation
@sythesize cancelledBlock;

приводит к EXC_BAD_ACCESS при установке cancelledBlock

но если я сделаю:

//Header
@property (nonatomic, copy) void (^cancelledBlock)(void);

//Implementation
@sythesize cancelledBlock; //saves me doing the getter as well

- (void)setCancelledBlock:(void (^)(void))aCancelledBlock {
    if (cancelledBlock == aCancelledBlock) {
        return;
    }
    void (^oldValue)(void) = cancelledBlock;
    cancelledBlock = Block_copy(aCancelledBlock);
    Block_release(oldValue);

}

EXC_BAD_ACCESS отсутствует и все работает как надо.


person Jonathan.    schedule 18.08.2011    source источник
comment
Вы должны выпускать только то, что вы сохранили или скопировали ранее.   -  person Richard    schedule 18.08.2011
comment
Я знаю, что, как я сказал в своем вопросе, попытка сделать [myBlock copy] дает EXC_BAD_ACCESS, но Block_copy(myBlock) нет   -  person Jonathan.    schedule 18.08.2011
comment
Можете ли вы показать нам полный пример?   -  person Joshua Weinberg    schedule 18.08.2011
comment
На самом деле примеров нет, везде, где я использую блоки, они одинаковы.   -  person Jonathan.    schedule 18.08.2011
comment
Скопированные свойства блока работают нормально. Если в вашем случае это не так, вам следует создать и загрузить простой демонстрационный проект, который мы можем попробовать.   -  person zoul    schedule 18.08.2011
comment
Я только что создал демонстрационный проект, и он отлично работает. проект, в котором я сейчас работаю, с этой проблемой был создан в Xcode 3.2, до Xcode 4 и iOS5 (с ARC, возможно, это имеет значение, хотя я отключил его в демонстрационном проекте).   -  person Jonathan.    schedule 18.08.2011
comment
С каким компилятором и IDE вы столкнулись с проблемой? Если его GCC перевернуть на Clang   -  person Joshua Weinberg    schedule 19.08.2011


Ответы (1)


После долгого и скучного дня и вечера я наконец наткнулся на этот ответ здесь, хотя это может показаться несвязанным, цепочка веб-сайтов, которые я посетил, чтобы найти его, создает эту связь.

По сути, мне пришлось удалить -weak_library /usr/lib/libSystem.B.dylib из флагов компоновщика и заменить его на -weak-lSystem.

person Jonathan.    schedule 18.08.2011
comment
Спасибо, Джонатан! Спустя более 4 часов вы решили мою проблему! - person Heiko Behrens; 14.09.2011
comment
Вау. Я буквально потратил недели, пытаясь отследить, что вызывало сбой моего приложения при запуске в симуляторе. Этот ответ сделал это. Большое спасибо! - person Kyle Slattery; 16.09.2011
comment
Я знаю, насколько раздражает эта проблема, я просто хотел бы знать, почему это решение работает. - person Jonathan.; 16.09.2011
comment
Я бы хотел, чтобы в SO была система пожертвований, чтобы я мог дать вам 1000 баллов за этот ответ. Я не уверен, смог бы я сам найти причину за несколько долгих и скучных вечеров. - person kizzx2; 29.01.2012