Racket 球拍目标-C FFI-避免重新定义等级
我正在使用Racket Objective-C FFI在应用程序中嵌入WebKit WebView 为了接收页面加载通知,我在Racket中创建了一个新的ObjC类,该类被设置为web视图的帧加载委托 该类看起来像:Racket 球拍目标-C FFI-避免重新定义等级,racket,Racket,我正在使用Racket Objective-C FFI在应用程序中嵌入WebKit WebView 为了接收页面加载通知,我在Racket中创建了一个新的ObjC类,该类被设置为web视图的帧加载委托 该类看起来像: (define-objc-class MyWebFrameLoadDelegate NSObject [] (- _void (webView: [_id wv] didFinishLoadForFrame: [_id wf]) (send frame set-st
(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或更通用的球拍功能来避免重新定义该类
我尝试用条件包装define objc类
,但它必须是顶级表单
我可以直接使用原始的ObjC运行时函数,动态地定义委托类——但最好避免这样做
解决方案-将
define objc类
包装在let
中,以在条件中的嵌套作用域中定义该类:
(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类
。但是,它是一个定义表单,因此不能将其用作表达式。您应该能够执行以下操作:
(define MyClass
(or ___ ;; find the class, if it already exists
(let ()
(define-objc-class MyClass ___)
MyClass)))
顺便说一句,3月7日发生的撞车事件似乎得到了解决。以防万一您错过了: 享受,测试床的完整来源: