EXC_BAD_ACCESS при копировании или сохранении блока - PullRequest
16 голосов
/ 18 августа 2011

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

[myBlock copy];

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

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

Block_copy(myBlock);

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

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

Например: With Properties:

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

1 Ответ

26 голосов
/ 19 августа 2011

После долгого и скучного дня и вечера я наконец-то наткнулся на этот ответ здесь , хотя может показаться, что цепочка сайтов, которые я посетил, чтобы найти его, может не иметь отношения.* В основном мне пришлось удалить -weak_library /usr/lib/libSystem.B.dylib из флагов компоновщика и заменить его на -weak-lSystem.

...