gpt4 book ai didi

c++ - 访问屏幕尺寸的 Objective C 运行时

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:15:34 24 4
gpt4 key购买 nike

我正在从事一个不需要使用 Cocoa 和 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

使用 Cocoa 不是一种选择,Carbon 也不再真正受支持。我希望有人熟悉 Objc Runtime 并且能够解决这个问题。

最佳答案

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()的变体之一。具体来说,就是可以返回无法放入堆栈的大型结构。

Using Cocoa isn't an option

通过 objc_msgSend() 使用 Cocoa 仍在使用 Cocoa!

上面的代码并不比简单地把所有东西都写成 Objective-C 更能移植到任何其他平台。您仍然不能在 Linux 或 Windows 上使用 NSScreen,因此,在任何一个平台上编译上述代码行都没有意义。

最好采用与其他跨平台库相同的方法。

• 创建一个 API,它是您的通用跨平台 UI API

• 在该 API 下,尽可能多地使用可移植代码实现

• 创建一个低级桥接 API,在您的可移植代码和系统之间提供接口(interface)

• 为每个平台实现特定于所需平台技术的桥接 API

这将允许您直接在 OS X 上使用 Objective-C,同时仍然在顶部维护一个跨平台 API。

关于c++ - 访问屏幕尺寸的 Objective C 运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21804801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com