2015-10-15 6 views
8

मैं NSObject के सी स्ट्रक्चर लेआउट को समझने के लिए निम्न कोड का उपयोग करने का प्रयास कर रहा हूं। सबसे पहले मैं एनएसडीटा का उपयोग करके अपने स्ट्रक्चर लेआउट को प्रिंट करता हूं, फिर मैं [NSObject class] का उपयोग कर क्लास पॉइंटर को सीधे प्रिंट करता हूं।उद्देश्य सी ऑब्जेक्ट का आईएसए फ़ील्ड अपने क्लास पॉइंटर के साथ 1 ऑफ़सेट क्यों है?

id obj = [NSObject new]; 
long nsSize = class_getInstanceSize([NSObject class]); 
NSData *nsData = [NSData dataWithBytes:(__bridge const void *)obj length:nsSize]; 
NSLog(@"obj: %@", nsData); 
NSLog(@"NSObject Class: %p", [NSObject class]); 

और मैं परिणाम मिला:

2015-10-15 08:11:53.913 ObjC_CMD[11406:1999149] obj: <f1e06573 ffff1d00> 
2015-10-15 08:11:53.913 ObjC_CMD[11406:1999149] NSObject Class: 0x7fff7365e0f0 

दिलचस्प बात यह है, वर्ग सूचक के अंत e0f0 है जबकि NSData प्रिंट परिणाम अपने इसा से पता चलता के रूप में eof1 (यह उलटे क्रम में है थोड़ा एंडियन की वजह से)। मैंने पुस्तक में पढ़ा है कि आईएसए पॉइंटर किसी ऑब्जेक्ट के स्ट्रक्चर लेआउट में सबसे ऊपर है, तो 1 ऑफसेट क्यों है?

वैसे, मैंने अन्य प्रकार की वस्तुओं पर भी कोशिश की है, हमेशा 1 ऑफसेट आईएसए और क्लास पॉइंटर के बीच ऑफसेट है। क्या वे समान नहीं होना चाहिए?

पीएस मैंने अभी देखा है कि क्लास पॉइंटर 0x7fff से शुरू होता है, लेकिन सी स्ट्रक्चर में आईएसए 0xffff लगता है, यह अंतर भी दिलचस्प है। [NSObject class] से प्राप्त आईएसए फ़ील्ड और क्लास पॉइंटर के बीच सटीक संबंध क्या है?

उत्तर

5

The 1 in the least significant bit means isa is not a pointer। 64-बिट भूमि में, the 64-bits of isa got repurposed बिट-मास्क में। isa बिट-मास्क के सबसे महत्वपूर्ण पक्ष पर अन्य बिट फ़ील्ड और संदर्भ गणना हैं।

isa बिट-मास्क (मध्य में 30 बिट्स) का हिस्सा कक्षा वस्तु की पहचान करता है, जो कि आपने पहचाना हिस्सा है।

+0

बहुत बहुत धन्यवाद :) –

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