Контекст: я работаю над мостом Pharo / Smalltalk -> Objective-C
Сценарий: в следующем фрагменте Objective-C ScriptingBridge:
iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesTrack *currentTrack = iTunes.currentTrack; //[1]
// This low level way works too
//iTunesTrack *currentTrack = [iTunes propertyWithCode: 'pTrk']; //[2]
[iTunes playpause]; //[3]
Проблема: мост использует class_getInstanceMethod, чтобы определить, понимает ли объект сообщение / селектор, но он возвращает NULL для сообщений сценария, таких как playpause
Вопрос № 1 Почему class_getInstanceMethod возвращает NULL для скриптовых сообщений типа playpause? Тот же вопрос для class_copyMethodList? Что особенного в сообщениях сценариев, что они не действуют как другие сообщения Obj-C (кроме случаев, когда они действуют!)?
Вопрос № 2 [РЕШЕН - см. ответ @ Мэтта]
Где, согласно документам, в "динамически определяемом подклассе для приложение iTunes "размещает ли SB" специфичные для приложения методы, которые автоматически обрабатывают отправку событий Apple "? И, учитывая, что class_getInstanceMethod не может найти такое поведение (см. Ниже), какой надежный способ для моста проверить это (т.е. существует ли такой метод / сообщение)?
Objective-C Runtime API сообщает о смешанных результатах. С одной стороны, у класса iTunesApplication, похоже, нет никаких методов (или свойств, если на то пошло):
class_copyMethodList([iTunes class]...возвращает нулевые методыclass_getInstanceMethod, который мост использует для поиска и выполнения методов, не работает.
С другой стороны, #playpause можно запросить и отправить через другие части API:
respondsToSelector:-> ИСТИНАmethodSignatureForSelector:возвращает подпись- и
performSelector:фактически отправляет сообщение
Как ни странно, methodForSelector:@"playpause" успешно возвращает IMP в Obj-C, но вылетает, если отправлено с другой стороны моста.
Вопрос №3 [решен]
Как можно смоделировать / воспроизвести [3]?
Ответил @Willeke в комментариях: [iTunes sendEvent:'hook' id:'PlPs' parameters:0]