2013-03-11 9 views
6

को फिर से परिभाषित करने से बचें मैं ऐप में वेबकिट वेबव्यू एम्बेड करने के लिए रैकेट ऑब्जेक्टिव-सी एफएफआई का उपयोग कर रहा हूं।रैकेट उद्देश्य-सी एफएफआई - कक्षा

पेज लोड नोटिफिकेशन प्राप्त करने के लिए मैं रैकेट में एक नई ओबीजेसी कक्षा बना रहा हूं जो वेब-व्यू के फ्रेम-लोड प्रतिनिधि के रूप में सेट है। कोड DrRacket भीतर यह बहुत अच्छा पहली बार काम करता है चल रहा है जब

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

:

वर्ग की तरह कुछ लग रहा है।

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 वर्ग कारण है कि की फिर से परिभाषा है कि लगता है: इसके अलावा पुनरावृत्तियों प्रक्रिया मरने के लिए होता है।

क्या एफएफआई, या अधिक सामान्य रैकेट सुविधाओं का उपयोग करके एक साफ तरीका है, कक्षा को फिर से परिभाषित करने से बचने के लिए यदि यह पहले से मौजूद है?

मैंने सशर्त में define-objc-class को लपेटने की कोशिश की लेकिन इसे शीर्ष-स्तर का फॉर्म होना आवश्यक है।

मैं कच्चे ओबीजेसी रनटाइम कार्यों में उतर सकता हूं और फ्लाई पर प्रतिनिधि वर्ग को परिभाषित कर सकता हूं - लेकिन इससे बचना अच्छा होगा।


समाधान - एक let में define-objc-class लपेट एक सशर्त अंदर एक नेस्टेड दायरे में वर्ग को परिभाषित करने के लिए:

(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

testbed का पूर्ण स्रोत: https://gist.github.com/nickmain/5136923 –

उत्तर

4

मुझे नहीं लगता कि define-obj-class शीर्ष स्तर पर किया जाना चाहिए। यह एक परिभाषा रूप है, हालांकि, आप इसे अभिव्यक्ति के रूप में उपयोग नहीं कर सकते हैं। आपको निम्न रूप में कुछ करने में सक्षम होना चाहिए:

:

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

BTW, यह क्रैश होने व्यवहार के लिए एक ठीक मार्च 7.

+0

बहुत धन्यवाद - कि काम किया! –

1

पर हामी भर दी थी की तरह लग रहा शायद ज़रुरत पड़े तो आप इसे याद किया https://github.com/shekari/racket-webkit/blob/master/webkit.rkt

का आनंद लें,

+0

यह वास्तव में उपयोगी लगता है - बहुत धन्यवाद! –