В чем разница между NSInvocation и блоком? - PullRequest
5 голосов
/ 27 февраля 2012

когда я говорю блок, я имею в виду:

^(int a) {return a*a;};

кроме того, блок поддерживается только iOS4 и выше.

В чем разница между этими двумя?

Ответы [ 3 ]

4 голосов
/ 27 февраля 2012

NSInvocation - это сообщение (с помощью селектора) к объекту с необязательными параметрами, которые могут быть выполнены позже (или сейчас), и вне текущего контекста (помните, конечно, что вы копируете против сохранения или ссылки, если Вы двигаете это). NSInvocation имеет то преимущество, что вы можете выборочно копировать / ссылаться именно на то, что вам нужно.

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

3 голосов
/ 27 февраля 2012

NSInvocation - это объект, который инкапсулирует вызов сообщения: целевой объект, селектор, аргументы и возвращаемое значение. Блок - это объект, который инкапсулирует фрагмент кода и некоторую информацию о состоянии программы, ведущей к этому разделу: в частности, он записывает переменные в стеке вызовов до создания блока.

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

0 голосов
/ 27 февраля 2012

Проще говоря, NSInvocation менее мощен, чем блоки.Он просто инкапсулирует один вызов метода в одном объекте, тогда как блоки могут переносить много строк произвольного кода.Даже ваш очень простой блок возведения в квадрат невозможно представить, используя вызов без поддержки существующего класса, который бы сам возводил в квадрат.

...