Зачем мне использовать NSInvocation вместо блока?

Может ли кто-нибудь предложить конкретную причину использования NSInvocation вместо простого использования блока или даже обычного вызова метода? Я нахожу описания NSInvocation в Интернете, но нет примеров того, где это жизненно важно для использования или хотя бы единственного хорошего варианта.


person user255468    schedule 23.04.2014    source источник
comment
NSInvocation не может захватывать значения из объемлющей области так же легко, как блоки.   -  person David Zech    schedule 24.04.2014
comment
Можете ли вы добавить что-нибудь о том, почему вы даже думаете об их взаимозаменяемости? Это поможет респондентам сосредоточиться на вашей реальной проблеме.   -  person jscs    schedule 24.04.2014
comment
К вашему сведению, вы очень редко создаете NSInvocations. Они, как правило, используются только в низкоуровневой сантехнике и таких вещах, как forwardInvocation:. Блоки используются намного шире.   -  person Chuck    schedule 24.04.2014
comment
Привет, на самом деле это всплыло в интервью в известной туристической компании. Высокомерный чувак вел себя так, как будто они действительно важны, и как я смею не знать, зачем я их использую.   -  person user255468    schedule 24.04.2014
comment
Обратите также внимание на то, что NSInvocations — это огромная синтаксическая боль в заднице. Их нетривиально правильно создавать и использовать.   -  person Ben Zotto    schedule 25.04.2014


Ответы (2)


NSInvocations и блоки могут использоваться для инкапсуляции вызова метода вместе с аргументами и получателем, которые не определены до времени выполнения. До того, как появились блоки, NSInvocation был единственным способом сделать это. Если это все, что вам нужно сделать, лучше использовать блоки. Использование NSInvocation в наши дни встречается довольно редко.

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

Это имеет некоторые преимущества:

  1. В отличие от непрозрачных блоков, у NSInvocation можно запросить селектор, получатель, аргументы и сигнатуру вызываемого метода. Если вы получаете NSInvocation в качестве аргумента метода (как в случае с -forwardInvocation NSObject), вы можете извлечь аргументы и вместо этого вызвать другой метод.

  2. NSInvocation может быть создан для вызова произвольного метода во время выполнения с использованием -initWithMethodSignature:. Например, если вы хотите реализовать функцию eval() для Objective-C, вы должны использовать NSInvocation для фактического вызова методов.

person Chris Devereux    schedule 23.04.2014
comment
Под функцией eval() вы имеете в виду как в смысле Лиспа? Опять же, я не вижу никакой реальной цели для этого. - person user255468; 24.04.2014
comment
github.com/ReactiveCocoa/ReactiveCocoa/blob/master/ - person Chris Devereux; 24.04.2014
comment
Или, если бы вы писали фиктивную библиотеку, (1) было бы очень полезно. - person Chris Devereux; 24.04.2014

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

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

person newacct    schedule 25.04.2014