2013-08-16 3 views
3

Контекст:resolveInstanceMethod с неизвестным количеством аргументов

У меня есть зависимость инъекция контейнер - www.typhoonframework.org

Это позволяет использовать интерфейс для определения компонентов для их решений во время выполнения - с помощью resolveInstanceMethod и implantationWithBlock для трамплина запроса на контейнер DI.

Пользователи запрашивают некоторые параметры, которые должны быть предоставлены во время выполнения. Например:

[assembly dangerousEnemyWithWeapon:id<BigGun>] 

. , где враг собирается из классов сотрудничества в контейнере DI, но пушка предоставляется во время выполнения. , ,

Вопрос:

Можно ли использовать resolveInstanceMethod определить реализацию, где число аргументов не известен фронт?

Я хотел бы упаковать эти аргументы и передать их другому ответчику.

Аргументы могут быть упакованы в порядке или добавлены в словарь с соответствующей селекторной частью в качестве ключа.

+0

Вы посмотрели на 'forwardingTargetForSelector:'? Это медленнее, чем 'resolveInstanceMethod:', но намного быстрее, чем 'forwardInvocation:'. Возможно, это удовлетворит ваши потребности. –

+0

Спасибо за предложение Rob. , Я хочу перевести селектор и аргументы в [container componentForKey: key withArguments: ]. , Полезно знать характеристики производительности этого метода, хотя это потенциально важно. –

+0

Что такое 'ключ'? Вы знаете класс объекта, которому хотите отправить сообщение? –

ответ

5

Для этого вы не можете использовать +resolveInstanceMethod:, но вы можете использовать традиционную пересылку. +resolveInstanceMethod: просто устанавливает новый метод экземпляра в классе с использованием среды выполнения Objective-C. Вы не можете повлиять на то, как это называется. Он будет вызываться так же, как и любой другой метод с аргументами в регистрах и в стеке, как их вызывал вызывающий. У вас нет возможности упаковывать или маршалировать аргументы.

Если вы реализуете -forwardInvocation: и -methodSignatureForSelector:, то вы получаете объект NSInvocation. Это уже упаковка аргументов (и возвращаемое значение). Вы можете использовать это как есть или опросить его, чтобы распаковать аргументы и переупаковать их, как вы хотите.

+0

Спасибо Кен. , Я уже использую метод resolveInstance для чего-то другого, но я думаю, что я могу уйти от преобразования, чтобы использовать forwardInvocation. , –

+0

'forwardInvocation:' далеко, гораздо медленнее, чем 'resolveInstanceMethod:'. Просто FYI. –

+0

Я получил свой первоначальный вариант использования для работы с forwardInvocation вместо resolInstanceMethod. , Я думаю, что это сработает для меня. , Производительность потенциально может быть проблемой. –

Смежные вопросы