yeniden tanımlama kaçının. Ben Web görünüşü kare yük temsilci olarak ayarlanır Racket yeni objc sınıf oluşturma sayfa yükleme bildirimi almak içinRaket Objective-C FFI - Bir uygulamadaki bir WebKit WebView'ı gömmek için Raket Objective-C FFI kullanıyorum bir sınıf
. büyük ilk kez çalışır DrRacket içinde kod çalıştırırken
(define-objc-class MyWebFrameLoadDelegate NSObject
[]
(- _void (webView: [_id wv] didFinishLoadForFrame: [_id wf])
(send frame set-status-text "Page Loaded")))
:
sınıf gibi görünür. o nedenidir objc sınıfının yeniden tanımı olduğunu belirtmek görünüyor
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
...
...: Daha tekrarlamalar süreci ölmeye neden olur.
yeniden tanımlayan zaten varsa sınıfı önlemek için, FFI, ya da daha genel Raket özelliklerini kullanarak temiz bir yolu var mı? bir koşullu içindedefine-objc-class
kaydırma denedim ama üst düzey bir formu olması gerekiyor.
çiğ objc çalışma zamanı işlevlerine açılan ve anında temsilci sınıfını tanımlamak olabilir - ama o kaçınmak güzel olurdu.
Çözüm - koşullu içine yuvalanmış bir kapsamda sınıfını tanımlamak için bir let
içinde define-objc-class
sarın:
(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)))
Tam kaynak: https://gist.github.com/nickmain/5136923 –