को फिर से परिभाषित करने से बचें मैं ऐप में वेबकिट वेबव्यू एम्बेड करने के लिए रैकेट ऑब्जेक्टिव-सी एफएफआई का उपयोग कर रहा हूं।रैकेट उद्देश्य-सी एफएफआई - कक्षा
पेज लोड नोटिफिकेशन प्राप्त करने के लिए मैं रैकेट में एक नई ओबीजेसी कक्षा बना रहा हूं जो वेब-व्यू के फ्रेम-लोड प्रतिनिधि के रूप में सेट है। कोड 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)))
testbed का पूर्ण स्रोत: https://gist.github.com/nickmain/5136923 –