Может ли кто-нибудь предложить конкретную причину использования NSInvocation
вместо простого использования блока или даже обычного вызова метода? Я нахожу описания NSInvocation
в Интернете, но нет примеров того, где это жизненно важно для использования или хотя бы единственного хорошего варианта.
Зачем мне использовать NSInvocation вместо блока?
Ответы (2)
NSInvocations и блоки могут использоваться для инкапсуляции вызова метода вместе с аргументами и получателем, которые не определены до времени выполнения. До того, как появились блоки, NSInvocation был единственным способом сделать это. Если это все, что вам нужно сделать, лучше использовать блоки. Использование NSInvocation в наши дни встречается довольно редко.
Однако в отличие от блоков, которые могут представлять любой объем кода вместе с захваченными значениями, NSInvocation всегда представляет собой вызов одного метода.
Это имеет некоторые преимущества:
В отличие от непрозрачных блоков, у NSInvocation можно запросить селектор, получатель, аргументы и сигнатуру вызываемого метода. Если вы получаете NSInvocation в качестве аргумента метода (как в случае с
-forwardInvocation
NSObject), вы можете извлечь аргументы и вместо этого вызвать другой метод.NSInvocation может быть создан для вызова произвольного метода во время выполнения с использованием
-initWithMethodSignature:
. Например, если вы хотите реализовать функциюeval()
для Objective-C, вы должны использовать NSInvocation для фактического вызова методов.
NSInvocation
позволяет вам динамически во время выполнения создавать и вызывать вызов сообщения цели-C для метода, который вы можете не знать во время компиляции, и позволяет вам устанавливать аргументы, используя информацию о типах и количестве аргументов из сигнатура метода, о которой вы, опять же, можете не знать во время выполнения. (У вас может быть место, которое должно иметь возможность вызывать разные методы с разными сигнатурами и передавать разные вещи в зависимости от этих сигнатур.) Таким образом, это добавляет уровень динамики в механизм передачи сообщений. Я не уверен, как блоки связаны с этим.
NSInvocation
также используется в -forwardInvocation:
, если вы хотите, чтобы ваш объект мог обрабатывать произвольные (не фиксированные во время компиляции) сообщения, где система отправки сообщений создает объект NSInvocation
, описывающий вызов, и передает его вам, чтобы вы могли проанализировать его самостоятельно. и потенциально изменить аргументы и вызвать их для другого объекта или иным образом обработать информацию. Это добавляет динамизма в обработку сообщений во время выполнения. Я также не знаю, как блоки связаны с этим.
forwardInvocation:
. Блоки используются намного шире. - person Chuck   schedule 24.04.2014