2011-06-22 8 views
5

मैं उद्देश्य-सी के साथ लुआ को इंटरफ़ेस करने की कोशिश कर रहा हूं, और मुझे लगता है कि NSSelectorFromString() के साथ स्ट्रिंग रूपांतरण बहुत अधिक है क्योंकि लूआ को सभी तारों को आंतरिक बनाने के लिए कॉपी करना है (हालांकि मुझे इसके बारे में निश्चित नहीं है)।क्या मैं उद्देश्य-सी में एसईएल को किसी सूचक के रूप में मान सकता हूं और संभाल सकता हूं?

तो मैं लुआ में एक चयनकर्ता का प्रतिनिधित्व करने के लिए अधिक हल्के तरीके खोजने की कोशिश कर रहा हूं। एक ऑब्जेक्टिव-सी चयनकर्ता एक पृथक प्रकार है, लेकिन यह कुछ के सूचक के रूप में परिभाषित किया गया है:

typedef struct objc_selector *SEL; 

तो यह एक नियमित रूप से सूचक के रूप में संभाल करने के लिए सुरक्षित लग रहा है, तो मैं lightuserdata साथ लुआ को इसे पारित कर सकते हैं। क्या यह ठीक है?

+2

सी तारों का उपयोग करने में मदद मिलेगी? आप 'NSSelectorFromString()' के बजाय 'sel_registerName()' का उपयोग कर सकते हैं, और पूर्व एक सी स्ट्रिंग तर्क स्वीकार करता है। अन्यथा, यदि आप उद्देश्य-सी कोड से लूआ/सी कोड में चयनकर्ता प्राप्त कर रहे हैं तो आप 'शून्य' के रूप में 'SEL' का इलाज कर सकते हैं। –

+0

मजेदार बात यह है कि एक एसईएल पहले से ही एक सी स्ट्रिंग के लिए एक सूचक है ... नहीं कि मैं आपको इसका उपयोग करने के लिए प्रोत्साहित करना चाहता हूं। – JustSid

+0

एक एसईएल एक सी स्ट्रिंग के लिए एक सूचक है लेकिन यह एक बहिष्कृत कार्यान्वयन विस्तार है। – Lothar

उत्तर

2

मुझे विश्वास नहीं है कि इसे एक सूचक (यहां तक ​​कि void पॉइंटर) के रूप में संभालना सुरक्षित है, क्योंकि यदि यह भविष्य में कार्यान्वयन या भाषा के एक अलग कार्यान्वयन में कभी भी बदल जाता है। मुझे एक औपचारिक उद्देश्य-सी कल्पना नहीं मिली जो बताती है कि कार्यान्वयन क्या परिभाषित करता है, लेकिन अक्सर जब इस तरह के अपारदर्शी प्रकारों का उपयोग किया जाता है तो इसका मतलब है कि आपको अंतर्निहित प्रकार के बारे में विवरण नहीं जानना चाहिए। वास्तव में, संरचना अग्रेषित की जाती है ताकि आप इसके किसी भी सदस्य तक नहीं पहुंच सकें।

दूसरी समस्या जो आप चला सकते हैं समानता तुलना लागू कर रही है: चयनकर्ताओं को स्थिरांक के पूल के संदर्भ हैं या प्रत्येक चयनकर्ता उत्परिवर्तनीय है। एक बार फिर, कार्यान्वयन परिभाषित किया गया।

ऊपर सुझाए गए सी तारों का उपयोग करना शायद आपकी सबसे अच्छी शर्त है; रूबी चयनकर्ताओं के लिए प्रतीकों का उपयोग करने के लिए प्रबंधन करता है और प्रदर्शन प्रदर्शन के बहुत अधिक नहीं है। चूंकि तार const हैं, इसलिए lua को की प्रतिलिपि बनाने की आवश्यकता नहीं है, लेकिन संभवतया सुरक्षित होने के लिए संभव है। यदि आप तारों की प्रतिलिपि बनाने का कोई तरीका नहीं ढूंढ सकते हैं तो आप उस प्रदर्शन को अधिक हिट नहीं कर सकते हैं।

संबंधित मुद्दे