Есть ли преимущество в использовании блоков над функциями в Objective-C? - PullRequest
5 голосов
/ 27 декабря 2011

Я знаю, что блок - это многократно используемый кусок исполняемого кода в Objective-C.Есть ли причина, по которой я не должен помещать тот же кусок кода в функцию и просто вызывать функцию, когда мне нужен этот код для запуска?

Ответы [ 2 ]

14 голосов
/ 27 декабря 2011

Это зависит от того, чего вы пытаетесь достичь. Одна из замечательных особенностей блоков заключается в том, что они охватывают локальные рамки. Вы можете достичь того же конечного результата с помощью функции, но в конечном итоге вам придется что-то сделать, например передать объект контекста, полный соответствующих значений. С блоком вы можете сделать это:

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 :

Блоки являются полезной альтернативой традиционным функциям обратного вызова для две основные причины:

  1. Они позволяют вам писать код в точке вызова, которая выполняется позже в контексте реализации метода. Блоки при этом часто параметры каркасных методов.

  2. Они разрешают доступ к локальным переменным. Вместо того, чтобы использовать обратные вызовы требуя структуры данных, которая воплощает все контекстуальные информация, необходимая для выполнения операции, вы просто получаете доступ к локальным переменные напрямую.

4 голосов
/ 27 декабря 2011

Как Брэд Ларсон комментирует в ответ на этот ответ :

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

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

...