2009-08-01 14 views
7

देता है यदि ऑब्जेक्ट_getIvar में वेरिएबल एक मूल डेटा प्रकार है (उदाहरण के लिए फ्लोट, int, bool) मैं फ़ंक्शन के रूप में मूल्य कैसे प्राप्त करूं दस्तावेज के अनुसार एक सूचक (आईडी) देता है। मैंने int, int * पर कास्टिंग करने का प्रयास किया है, लेकिन जब मैं इसे NSLog में लाने का प्रयास करता हूं, तो मुझे एक असंगत सूचक प्रकार के बारे में त्रुटि मिलती है।ऑब्जेक्ट_getIvar (self, myIntVar) से int मान कैसे प्राप्त करें क्योंकि यह पॉइंटर

उत्तर

6

हो रही है:

myFloat = 2.34f; 

float myFloatValue; 
object_getInstanceVariable(self, "myFloat", (void*)&myFloatValue); 

NSLog(@"%f", myFloatValue); 

आउटपुट:

2,340000

स्थापना:

float newValue = 2.34f; 
unsigned int addr = (unsigned int)&newValue; 

object_setInstanceVariable(self, "myFloat", *(float**)addr); 

NSLog(@"%f", myFloat); 

आउटपुट:

2,340000

+2

यह काम नहीं करता है क्योंकि आपके पास टाइपो था, यदि आप बदलते हैं (शून्य) और myFloatValue (शून्य *) और myFloatValue यह विज्ञापित के रूप में काम करता है। –

+0

अरे, आप सही हैं :) – jhauberg

+0

object_setInstance के लिए कोई विचार एक फ्लोट के लिए उपलब्ध है? मैं इसे int myInt = 5 के माध्यम से int के लिए काम करने के लिए प्राप्त कर सकता हूं; int theInt; object_setInstanceVairable (स्वयं, "theInt", (शून्य *) myInt); क्योंकि पॉइंटर्स और इनट एक ही आकार के हैं, इसलिए यह फ्लोट के लिए काम नहीं करता है। –

-1

शायद यह एनएसएनंबर में मुक्केबाजी का मूल्य है। तुम इतनी तरह लौटे आईडी के className NSLogging कर इसकी पुष्टि कर सकते हैं,:

id returnedValue = object_getIvar(self, myIntVar); 
NSLog(@"Class: %@", [returnedValue className]); 

संपादित करें: मैं सिर्फ इस एक यहाँ की तरह एक और सवाल पाया: Handling the return value of object_getIvar(id object, Ivar ivar)

मेरे अपने प्रयोग से, यह लगता है कि अपने मूल धारणा गलत था int और float और अन्य primitives वास्तविक मान के रूप में वापस आते हैं। हालांकि, यह सत्यापित करने के लिए ivar_getTypeEncoding का उपयोग करना उचित होगा कि लौटाया गया मूल्य वह प्रकार है जिसे आप उम्मीद कर रहे हैं।

+0

जब मैं फोन करने के लिए [returnedValue className] की कोशिश, मुझे कोई विधि वर्ग नाम चेतावनी नहीं मिली है। मैंने ऑब्जेक्ट_get क्लासनाम (object_getIvar (self, myIntVar) का उपयोग करने का प्रयास किया) (myIntVar वास्तव में लूप में आवंटित है इसलिए यह बदलता है) और लूप एक बार निष्पादित करता है और फिर मैं जीडीबी में समाप्त होता हूं लेकिन कोई त्रुटि लॉग नहीं होती है। लॉग इन होने वाला एकमात्र मान 'शून्य' है ... विचार? –

+0

@ रूस मैं इसे देख रहा हूं और प्रयोग कर रहा हूं। अगर मैं कुछ भी समझता हूं तो मैं अपना जवाब संपादित करूंगा। –

+0

याकूब ने object_getInstanceVariable का उपयोग करके काम करने के लिए इसे प्राप्त किया लेकिन मैं अभी भी उत्सुक हूं कि object_getIvar को काम करने के लिए कैसे प्राप्त करें क्योंकि यह स्पष्ट रूप से तेज़ है (http://developer.apple.com/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html # // apple_ref/c/func/object_getIvar) इसका उपयोग कर उदाहरणों के लिए नेट की खोज करने का प्रयास किया लेकिन कोई भी मूल प्रकारों के साथ इसका उपयोग नहीं कर रहा है। –

-1

आप उपयोग कर सकते object_getInstanceVariable सीधे: (यह परीक्षण नहीं किया)

void *ptr_to_result; 
object_getInstanceVariable(obj, "intvarname", &ptr_to_result); 
float result = *(float *)ptr_to_result; 
+0

मुझे तीसरे तर्क पर असंगत सूचक समय मिलता है .... मैं ओबज-सी से बहुत परिचित नहीं हूं, मुझे डर है। दस्तावेज़ों का कहना है कि यह एक शून्य सूचक होना चाहिए, जो आईडी के समान लगता है? जिस स्थिति में मैं ऊपर की तरह एक ही समस्या पर वापस आ गया हूं .... –

+0

ठीक है मैंने इसे शून्य * का उपयोग करने के लिए बदल दिया है। इसे आजमाएं – newacct

+0

अब यह आखिरी पंक्ति में जीडीबी से बाहर निकलता है, इस संदेश के बिना, क्यों कोई चेतावनी नहीं है। अगर मैं उस पंक्ति पर जारी रहता हूं तो मुझे 'EXC_BAD_ACCESS' मिलता है जो मुझे लगता है कि स्मृति प्रबंधन से संबंधित है। कोई और विचार? बीटीडब्लू मैं यह जांचने से पहले अपने var typeEncoding = "f" की जांच करता हूं, इसलिए यह चर/स्मृति आवंटन इत्यादि के मिलान के कारण नहीं हो सकता है, कम से कम मुझे ऐसा नहीं लगता है। –

2

मूल्य कि लौटा दिया जाता है वस्तु में सही जगह से मूल्य है, सही प्रकार नहीं है। int और BOOL (लेकिन float) के लिए, तुम सिर्फ सूचक एक int या BOOL को, कच्चा सकता है के बाद से संकेत दिए गए और ints एक ही आकार के होते हैं और वे एक दूसरे के लिए डाली जा सकता है:

(int)object_getIvar(obj, myIntVar) 
+0

हालांकि यह काम पर प्रतीत होता है .... मैं bools और ints को संभालने के लिए टाइप एन्कोडिंग पर एक केस का उपयोग कर सकता हूं लेकिन फ्लोट के लिए मैं अभी भी समाधान ढूंढ रहा हूं। –

3

एआरसी के लिए:

इस जवाब से प्रेरित होकर: 0,123,। आपको मूल-प्रकार के ivars प्राप्त करने के लिए object_getIvar के लिए फ़ंक्शन कॉल डालना होगा।

typedef int (*XYIntGetVariableFunction)(id object, const char* variableName); 
XYIntGetVariableFunction intVariableFunction = (XYIntGetVariableFunction)object_getIvar; 
int result = intVariableFunction(object, intVarName); 

मैं ऐसे समारोह संकेत के तेजी से परिभाषा के लिए एक छोटा सा उपयोगी मैक्रो बना दिया है: बुनियादी प्रकार आप मैक्रो के लिए कॉल निर्दिष्ट करने की आवश्यकता के लिए, तो फिर

#define GET_IVAR_OF_TYPE_DEFININTION(type, capitalized_type) \ 
typedef type (*XY ## capitalized_type ## GetVariableFunctionType)(id object, Ivar ivar); \ 
XY ## capitalized_type ## GetVariableFunctionType XY ## capitalized_type ## GetVariableFunction = (XY ## capitalized_type ## GetVariableFunctionType)object_getIvar; 

(पैरामीटर उदा(लंबे, LongLong) फिट होगा):

GET_IVAR_OF_TYPE_DEFININTION(int, Int) 

और उसके बाद पूर्णांक प्राप्त करने के लिए एक समारोह (या निर्दिष्ट) अलग-अलग प्रकार के उपलब्ध हो जाते हैं:

int result = XYIntGetVariableFunction(object, variableName)