Контекст: я работаю над мостом 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]
[iTunes playpause]-[iTunes sendEvent:'hook' id:'PlPs' parameters:0].[iTunes propertyWithCode: 'pTrk']возвращаетSBObject*,[iTunes propertyWithClass:[self.iTunes classForScriptingClass:@"track"] code:'pTrk']возвращаетiTunesTrack*. - person Willeke   schedule 26.05.2020SBApplicationстимулирует методы, динамически перехватывая `responsedsToSelector:` и друзей и конвертируя отправленные сообщения в отправленные Apple Event? - person Sean DeNigris   schedule 30.05.2020class_getInstanceMethod, что не работает для этих методов SB. Таким образом, я ищу обходной путь ... - person Sean DeNigris   schedule 01.06.2020class_getInstanceMethod. Но appscript имеет открытый исходный код, поэтому, как я уже сказал, если вы хотите знать, как это работает, вы можете убедиться в этом сами. Это все, что я могу предложить, извините. - person matt   schedule 01.06.2020playhouseбыл из документа SB, а не из того, что я придумал (и работает в Obj-C, только не в Pharo без некоторой магии времени выполнения Obj-C). - person Sean DeNigris   schedule 01.06.2020[iTunes playpause]и событием Apple. Если SB не использует сообщения Objective-C, что означают документы, когда подклассы SBApplication реализуют методы, специфичные для приложения, которые автоматически обрабатывают отправку событий Apple? ПочемуiTunes respondsToSelector: @"playpause"работает, т.е. возвращает истину? А как[iTunes playpause]работает? И т. Д. И т. Д. - person Sean DeNigris   schedule 03.06.2020playpause. И это подкласс SBApplication. Гоша, мне очень жаль, что я удалил свой предыдущий комментарий. - person matt   schedule 03.06.2020