Я работаю над проектом, в котором использование Какао и Objective C нежелательно.
Однажды я наткнулся на библиотеку времени выполнения Objective C и пытался использовать ее для доступа к размерам экрана.
Это код, который у меня есть в настоящее время:
auto screen = objc_msgSend(objc_lookUpClass("NSScreen"),sel_getUid("mainScreen")); //Returns an NSScreen*
auto frame = objc_msgSend(screen, sel_getUid("frame")); // should return an NSRect but I get an EXC_BAD_ACCESS and the program quits
Использование Какао не вариант, и на самом деле Carbon больше не поддерживается.
Я надеюсь, что кто-то знаком с Objc Runtime и способен решить эту проблему.
Если вы действительно хотите избежать получения Objective-C при получении этой информации, вам нужно погрузиться в низкоуровневый кварц (и удачи в этом!).
Я думаю, что команды, которые вам помогут, будут:
auto screen = objc_msgSend(objc_lookUpClass("NSScreen"),sel_getUid("mainScreen")); //Returns an NSScreen*
auto frame = objc_msgSend(screen, sel_getUid("frame")); // BAD_ACCESS
Конкретная причина сбоя заключается в том, что вам нужно использовать один из вариантов objc_msgSend (). В частности, тот, который может возвращать большие структуры, которые в противном случае не помещаются в стек.
Использование какао не вариант
Используя Какао через objc_msgSend()
все еще использует какао!
Приведенный выше код не более переносим на любую другую платформу, чем просто записывает все как Objective-C. Вы все еще не можете использовать NSScreen
в Linux или Windows и, следовательно, нет смысла компилировать указанные строки кода на любой платформе.
Вам гораздо лучше использовать тот же подход, что и в других кроссплатформенных библиотеках.
• создать API, который является вашим универсальным API кросс-платформенного интерфейса
• в рамках этого API реализуйте как можно больше в переносимом коде
• создать низкоуровневый API-интерфейс моста, который обеспечивает интерфейс между переносимым кодом и системой
• для каждой платформы реализовать тот API-интерфейс моста, который специфичен для желаемой технологии платформы
Это позволит вам использовать Objective-C непосредственно в OS X, сохраняя кросс-платформенный API на вершине.