Подтвердить что ты не робот

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

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

[myBlock copy];

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

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

Block_copy(myBlock);

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

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

Например: С помощью свойств:

//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, и все работает так, как должно быть.

4b9b3361

Ответ 1

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

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