2011-10-28 11 views
15

यह सरल प्रश्न हो सकता है, लेकिन क्यों मेरी कक्षा में NSCopying प्रोटोकॉल को लागू करने, मैं क्षेत्र == शून्यएनएससीपीआईपी लागू करते समय क्षेत्र हमेशा शून्य क्यों होता है?

- (id)copyWithZone:(NSZone *)zone 
{ 
    if (zone == nil) 
     NSLog(@"why this is allways nil"); 

    (...) 
} 

यह वस्तुओं के साथ प्रति सरणी के लिए इस पद्धति का उपयोग कहा जाता है।

[[NSArray alloc] initWithArray:myArray copyItems:YES]]; 

उत्तर

25

केविन की देखें और रॉबिन के जवाब सबसे सटीक है। ऑस्कर का जवाब सही के करीब है। लेकिन न तो Gnustep दस्तावेज और न ही जोन के अस्तित्व के लिए logancautrell के कारण काफी सही है।

जोन्स मूल रूप से बनाए गए थे - पहला एनएक्सज़ोन, फिर एनएसज़ोन - यह सुनिश्चित करने के लिए कि एक जोन से आवंटित वस्तुओं को स्मृति में अपेक्षाकृत संगत किया जाएगा, यह सच है। जैसे-जैसे यह निकलता है, यह ऐप का उपयोग करने वाली स्मृति की मात्रा को कम नहीं करता है; ज्यादातर मामलों में यह थोड़ा बढ़ता है।

बड़ा उद्देश्य वस्तुओं के एक समूह को बड़े पैमाने पर नष्ट करने में सक्षम होना था।

उदाहरण के लिए, यदि आप किसी दस्तावेज़ आधारित एप्लिकेशन में एक जटिल दस्तावेज़ लोड करना चाहते हैं, तो दस्तावेज़ बंद होने पर ऑब्जेक्ट ग्राफ़ के आंसू-डाउन वास्तव में काफी महंगा हो सकता है।

इस प्रकार, यदि किसी दस्तावेज़ के लिए सभी वस्तुओं को एक भी क्षेत्र और से आबंटित किया गया है कि क्षेत्र के लिए आवंटन मेटाडाटा कि क्षेत्र में भी था, तो दस्तावेज़ से संबंधित सभी वस्तुओं के विनाश के रूप में के रूप में सस्ता होगा बस ज़ोन को नष्ट करना (जो वास्तव में सस्ता था - "यहां, सिस्टम, इन पृष्ठों को वापस लेना है" - एक फ़ंक्शन कॉल)।

यह अविश्वसनीय साबित हुआ। यदि ज़ोन में किसी ऑब्जेक्ट का एक संदर्भ ज़ोन से बाहर निकलता है, तो आपका ऐप BOOM पर जाता है जैसे ही दस्तावेज़ बंद हो गया था और ऑब्जेक्ट को यह बताने का कोई तरीका नहीं था कि इसे रोकने के लिए जो भी संदर्भ दे रहा था। दूसरा, यह मॉडल भी "दुर्लभ संसाधन" समस्या का शिकार हो गया, जिसे अक्सर जीसीएड सिस्टम में सामना करना पड़ता था। यही है, यदि गैर-स्मृति संसाधनों पर दस्तावेज़ के ऑब्जेक्ट ग्राफ़ को ज़ोन विनाश से पहले कुशलतापूर्वक संसाधनों को साफ करने का कोई तरीका नहीं था।

अंत में, सभी अतिरिक्त नाजुकता वाले क्षेत्रों को एक बुरा विचार के साथ, लगभग एक प्रदर्शन जीत (आप कितनी बार जटिल दस्तावेज बंद करते हैं) का संयोजन नहीं है। एपीआई को बदलने में बहुत देर हो चुकी है, और हम vestiges के साथ छोड़ दिया गया है।

+0

बहुत बढ़िया, मैं उम्मीद कर रहा था कि आप इसका जवाब देंगे। साइड नोट, क्या यह किसी भी समय ऐप्पल दस्तावेज़ों में प्रलेखित था? मैं आज पाया जा सकता हूं कि एनएसजेडोन * नींव के तरीके हैं। – logancautrell

+3

ट्विटर पर @bbum मुझे मुफ्त में महसूस करें यदि इस तरह के प्रश्न हैं तो आप मेरे ध्यान में आना चाहते हैं। भाषा (और ओएस) का विकास वास्तव में आकर्षक है। अगर इसे कभी दस्तावेज किया गया था, तो यह संभवतः अत्याधुनिक दिनों के दौरान एक बचे हुए थे। मुझे नहीं लगता कि उचित मैक ओएस एक्स रिलीज में जोन की कभी भी सिफारिश की गई थी। – bbum

+1

मैं इसकी सराहना करता हूं, आपकी पोस्ट आपकी अद्वितीय स्थिति और इतिहास के कारण अत्यधिक मूल्यवान हैं। मैं चाहता हूं कि ऐप्पल इंजीनियरों ने यहां समय बिताया! – logancautrell

1

जोन पुराने दिनों से विरासत है जब कंप्यूटर के पास 8 मेगा या उससे कम रैम था।

इस चेक बाहर (3.1.2 मेमोरी आवंटन और क्षेत्र):

http://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_3.html

भी एक अच्छा इस के कोको बिल्डर पर अधिक चर्चा (अच्छी तरह से यह कोको देव मेलिंग सूची पर था) से नहीं है लगभग 10 साल पहले। यह वही है जो @bbum कह रहा था।

http://www.cocoabuilder.com/archive/cocoa/65056-what-an-nszone.html

जाहिर है इस एप्पल डॉक्स में दर्ज किया जाता था, लेकिन यह 2007-06-06 के बाद से कुछ बिंदु पर बदल गया था।

http://www.cocoadev.com/index.pl?NSZone

1

NSZone एक गैर-दस्तावेजी वर्ग है क्योंकि यह काफी पुराना है, इसका उद्देश्य ढेर आभासी स्मृति पृष्ठों का एक ही सेट का उपयोग करने पर वस्तुओं के आवंटन के लिए था अब है। हालांकि इसका अधिकतर उपयोग नहीं किया जाता है, लेकिन चूंकि इसका उपयोग पहले किया गया था, तब भी पैरामीटर पीछे की संगतता के लिए है।

3

NSZone बहुत समय पहले बहिष्कृत किया गया था। तथ्य यह है कि यह अभी भी विधि हस्ताक्षर में है (उदा। +allocWithZone: और -copyWithZone:) पीछे की संगतता के लिए हैं।

+1

अगर कॉपीविथज़ोन को हटा दिया गया है (एनएससीपीआईपी प्रोटोकॉल परिभाषा में क्या उल्लेख नहीं किया गया है), आवश्यक प्रतिलिपि के साथ एनएससीपीआईपी को कैसे कार्यान्वित किया जाए: इन दिनों में? – Marcin

+3

'-कोपीविथज़ोन: 'बहिष्कृत नहीं किया गया है। 'एनएसज़ोन' है। बस ज़ोन तर्क को अनदेखा करें। –

4

एक नल क्षेत्र का अर्थ है 'डिफ़ॉल्ट क्षेत्र का उपयोग करें'। ज़ोन का उपयोग अब आधुनिक उद्देश्य सी रनटाइम द्वारा नहीं किया जाता है और इसका उपयोग एआरसी के साथ भी नहीं किया जा सकता है।

documentation

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