gpt4 book ai didi

Racket Objective-C FFI - 避免重新定义一个类

转载 作者:行者123 更新时间:2023-12-04 15:13:00 25 4
gpt4 key购买 nike

我正在使用 Racket Objective-C FFI 在应用程序中嵌入 WebKit WebView。

为了接收页面加载通知,我在 Racket 中创建了一个新的 ObjC 类,该类被设置为 web View 的帧加载委托(delegate)。

该类看起来像:

(define-objc-class MyWebFrameLoadDelegate NSObject
[]
(- _void (webView: [_id wv] didFinishLoadForFrame: [_id wf])
(send frame set-status-text "Page Loaded")))

在 DrRacket 中运行代码时,它第一次运行良好。进一步的迭代会导致进程终止:
Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000020
...
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libobjc.A.dylib 0x00007fff8511e299 objc_registerClassPair + 63
1 Racket 0x00000001002d329c ffi_call_unix64 + 76
2 Racket 0x00000001002d3eb4 ffi_call + 644
3 Racket 0x00000001002c612f ffi_do_call + 1599
4 ??? 0x00000001004b50cc 0 + 4299903180
...

...这似乎表明原因是重新定义了 ObjC 类。

是否有使用 FFI 或更通用的 Racket 功能的干净方法来避免重新定义已经存在的类?

我尝试包装 define-objc-class在有条件的情况下,但它必须是顶级形式。

我可以下拉到原始的 ObjC 运行时函数并动态定义委托(delegate)类 - 但最好避免这种情况。

解决方案 - 包裹 define-objc-classlet在条件内的嵌套范围内定义类:
(define MyWebFrameLoadDelegate
(or (objc_lookUpClass "MyWebFrameLoadDelegate")
(let ()
(define-objc-class MyWebFrameLoadDelegate NSObject
[]
(- _void (webView: [_id wv] didFinishLoadForFrame: [_id wf])
(send frame set-status-text "Page Loaded")))
MyWebFrameLoadDelegate)))

最佳答案

我不认为define-obj-class必须在顶层使用。但是,它是一种定义形式,因此您不能将其用作表达式。您应该能够执行以下操作:

(define MyClass
(or ___ ;; find the class, if it already exists
(let ()
(define-objc-class MyClass ___)
MyClass)))

顺便说一句,看起来对崩溃行为的修复是在 3 月 7 日提交的。

关于Racket Objective-C FFI - 避免重新定义一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15346323/

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