2014-09-08 3 views
5

क्या कोई जानता है कि मुझे निम्नलिखित कोड के साथ & मेरे iVars की सेटिंग प्राप्त करने पर BAD_ACCESS क्यों मिलता है?मैं उद्देश्य-सी-रनटाइम के object_getIvar और object_setIvar को स्विफ्ट में कैसे उपयोग करूं?

class myClass: NSObject { 
    var model = "Unspecified" 

    override init() { 
     super.init() 

     var key: NSString = "model" 
     var aClass : AnyClass? = self 
     var ivar: Ivar = class_getInstanceVariable(aClass, key.UTF8String) 

     // Set 
     object_setIvar(aClass, ivar, "R56") 

     // Get 
     var value: AnyObject = object_getIvar(aClass, ivar) 
    } 

} 

myClass() 
+2

पहली समस्या यह है कि आपको 'object_setIvar' और' object_getIvar' के पहले तर्क के रूप में 'self' को पास करना चाहिए, लेकिन इसके बाद भी यह अजीब व्यवहार को क्रैश/प्रदर्शित करता है। मुझे एक बग पर संदेह है। –

उत्तर

1

आप क्योंकि स्विफ्ट कक्षाओं पारंपरिक Ivars अब और नहीं है (एक स्विफ्ट वर्ग 'इवर लेआउट आकर्षित करने और अपने आप के लिए देखने की कोशिश) एक बुरा पहुँच जाते हैं। लेकिन स्विफ्ट कक्षाएं रनटाइम के लिए उद्देश्य-सी ऑब्जेक्ट्स भी हैं, और इसमें स्विफ्ट कक्षाओं को छोड़कर कोई भी पथ नहीं दिखता है।

क्या हवाएं हो रही हैं रनटाइम हाथ आपको एक फर्जी iVar है कि यह वास्तव में कक्षा परिभाषा में उचित ऑफसेट के लिए अंक सोचता है (शायद 0 या वहां मौजूद है क्योंकि यह अस्तित्व में नहीं है)। जब आप ivar कहने का प्रयास करते हैं, तो रनटाइम शब्दशः derefs you some of the object's bytes and tries to wrap it back up in an Objective-C pointer। अक्सर इस डेटा में टैग की गई बिट बिट अनजाने में होती है, और अक्सर टैग किए गए वर्गों के लिए मानचित्र (मेरे परीक्षणों में मैं विश्वसनीय रूप से एक टैग किए गए पॉइंटर को वापस प्राप्त कर रहा था जिसके लिए रनटाइम विचार एनएसएमयूटेबलडेटा था)।

लंबी कहानी छोटी: आप इसे और नहीं कर सकते हैं।

+0

बस इसे पढ़ें और यह समझ में आता है कि मेरे डी ढांचे में तेजी से कक्षाओं में इवर स्थापित करने में समस्या क्यों है। मेरे पास यह सवाल है। अगर मैं एक तेज वर्ग में एक आंतरिक var सेट करना चाहता हूँ। मैं यह कैसे कर सकता हूं? उद्देश्य-सी में मैं एक आंतरिक चर घोषित कर सकता हूं और सेट कर सकता हूं जो इंटरफेस को साफ रखने में मदद करता है। क्या अब मुझे संपत्तियों के रूप में सब कुछ बेनकाब करना है? वह चूसना होगा। :-( – drekka

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

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