2013-03-11 20 views
6

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çinde define-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))) 
+0

Tam kaynak: https://gist.github.com/nickmain/5136923 –

cevap

4

Ben define-obj-class üst seviyede kullanılması gerekir sanmıyorum. Yine de bir tanım formu, bu yüzden bunu bir ifade olarak kullanamazsınız. Aşağıdaki gibi bir şey yapmak mümkün olmalıdır:

: Bu

+0

Çok teşekkürler - çalıştı! –

1

7 Mart'ta işlendiği çökmesini davranış için bir düzeltme benziyor, BTW

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

Sadece durumda bunu cevapsız https://github.com/shekari/racket-webkit/blob/master/webkit.rkt

Enjoy, testbed ait

+0

Gerçekten faydalı görünüyor - çok teşekkürler! –

İlgili konular