Это зависит от того, чего вы пытаетесь достичь. Одна из замечательных особенностей блоков заключается в том, что они охватывают локальные рамки. Вы можете достичь того же конечного результата с помощью функции, но в конечном итоге вам придется что-то сделать, например передать объект контекста, полный соответствующих значений. С блоком вы можете сделать это:
int num1 = 42;
void (^myBlock)(void) = ^{
NSLog(@"num1 is %d", num1);
};
num1 = 0; // Changed after block is created
// Sometime later, in a different scope
myBlock(); // num1 is 42
Таким образом, просто используя переменную num1, фиксируется ее значение во время определения myBlock.
Из документации Apple :
Блоки являются полезной альтернативой традиционным функциям обратного вызова для
две основные причины:
Они позволяют вам писать код в точке вызова, которая
выполняется позже в контексте реализации метода. Блоки
при этом часто параметры каркасных методов.
Они разрешают доступ к локальным переменным. Вместо того, чтобы использовать обратные вызовы
требуя структуры данных, которая воплощает все контекстуальные
информация, необходимая для выполнения операции, вы просто получаете доступ к локальным
переменные напрямую.