Веселая история!Блоки на самом деле являются объектами Objective-C.Тем не менее, нет открытого API для получения указателя self
блоков.
Однако, если вы объявляете блоки перед их использованием, вы можете использовать их рекурсивно.В среде без сбора мусора вы должны сделать что-то вроде этого:
__weak __block int (^block_self)(int);
int (^fibonacci)(int) = [^(int n) {
if (n < 2) { return 1; }
return block_self(n - 1) + block_self(n - 2);
} copy];
block_self = fibonacci;
необходимо , чтобы применить модификатор __block
к block_self
, потому что в противном случаеСсылка block_self
внутри fibonacci
будет ссылаться на нее до ее назначения (сбой вашей программы при первом рекурсивном вызове).__weak
должен гарантировать, что блок не фиксирует сильную ссылку на себя, что может вызвать утечку памяти.