вторник, 19 февраля 2019 г.

Копирование блоков

При попытке копировать блок он не скопировался. Видимо из-за оптимизации.


    int a=0;
    int j=0;
    __block int i=0;
    typeblock block = ^(void) {
        i+=10+j;
    };
    typeblock block_copy = [block copy];
    block();
    block_copy();


Переменные a, j, block, block_copy находятся в стеке.
адрес переменной i отличается от стекового.
Несмотря на копирование block и block_copy содержат указатель на один объект.



При попытке вызвать mutableCopy происходит исключение:
-[__NSMallocBlock__ mutableCopyWithZone:]: unrecognized selector sent to instance 0x6000003a4c30

Интересно, что значение block, где-то рядом с rip
rip: 0x000000010815c6e3 //после вызова block_copy()
block: 0x000000010815c750 (+0x6D)

То есть block находится где-то сразу за после функции, в которой но был создан.

Комментариев нет:

Отправить комментарий