2010-12-23 11 views
48

forum discussion से, ऐसा लगता है कि बड़ा अंतर प्रदर्शन कारक है, allocWithZone: विशेष स्मृति क्षेत्र से स्मृति आवंटित करेगा, जो स्वैपिंग की लागत को कम करेगा।आवंटन और allocWithZone के बीच क्या अंतर है :?

प्रैक्टिस में, लगभग allocWithZone का उपयोग करने का कोई मौका नहीं मिलता है: कोई भी उदाहरण देने के लिए सरल उदाहरण दे सकता है कि किस मामले को allocWithZone का उपयोग करना है:?

धन्यवाद,

+7

ध्यान दें कि वर्तमान (2014) ऐप्पल दस्तावेज कहता है कि 'जोन' पैरामीटर को अनदेखा किया गया है, और "यह विधि ऐतिहासिक कारणों से मौजूद है; स्मृति क्षेत्र अब उद्देश्य-सी द्वारा उपयोग नहीं किए जाते हैं।" तो स्वीकृत उत्तर अब सही नहीं हो सकता है। –

उत्तर

45

जब एक वस्तु एक और बनाता है, जिसे कभी कभी वे दोनों स्मृति का एक ही क्षेत्र से आवंटित कर रहे हैं यकीन है कि बनाने के लिए एक अच्छा विचार है। जोन विधि (एनएसओब्जेक्ट प्रोटोकॉल में घोषित) इस उद्देश्य के लिए उपयोग किया जा सकता है; यह उस क्षेत्र को वापस करता है जहां रिसीवर स्थित है।

यह मेरे लिए पता चलता है कि अपने ivars, और किसी भी वस्तुओं अपनी कक्षाओं के लिए खुद को "बनाने के" इस तरह से +allocWithZone: का उपयोग कर सकता, उदाहरणों वे एक ही क्षेत्र में बनाने बनाने के लिए।

-(id)init { 
    if (self = [super init]) { 
    someIvar = [[SomeOtherClass allocWithZone:[self zone]] init]; 
    } 

    return self; 
} 
+0

हां, यह allocWithZone का उपयोग करने के लिए एक अच्छा उदाहरण है: – Forrest

+44

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

+0

इसके लिए धन्यवाद। बहुत सूचनाप्रद। मैंने प्रलेखन में उन पर ध्यान केंद्रित करने की कमी को देखते हुए कहा कि उनका बिल्कुल उपयोग नहीं किया जाता है। – d11wtq

5

allocWithZone प्रयोग करने के लिए एक अच्छा उदाहरण है: जब आप NSCopy प्रोटोकॉल, आप अपने कस्टम की तरह (मूल्य से गहरी कॉपी/प्रतिलिपि) वस्तुओं copyable बनाने की अनुमति देता है जो कार्यान्वित कर रहे हैं:

(1) ClassName *newObject = [currentObject copy]; //results in newObject being a copy of currentObject not just a reference to it 

NSCopy प्रोटोकॉल आप एक विधि को लागू सुनिश्चित करता है:

(2) -(id)copyWithZone:(NSZone *)zone; 

जब एक वस्तु 'प्रतिलिपि' संदेश आप के रूप में ऊपर भेजने को कॉपी (1) जब 'के रूप में copyWithZone (विधि को संदेश भेजता है कहा 2)। उर्फ आपको ज़ोन प्राप्त करने के लिए कुछ भी करने की ज़रूरत नहीं है।

अब जब आपके पास इस संदेश पर भेजा गया 'ज़ोन' है, तो आप यह सुनिश्चित करने के लिए इसका उपयोग कर सकते हैं कि एक प्रतिलिपि उसी क्षेत्र में स्मृति से बनाई गई हो।

इस तरह इस्तेमाल किया जा सकता है:

-(id)copyWithZone:(NSZone *)zone 
{ 
    newCopy = [[[self class]allocWithZone:zone]init]; //gets the class of this object then allocates a new object close to this one and initialises it before returning 
    return(newCopy); 
} 

यह केवल जगह मुझे पता है allocWithZone वास्तव में प्रयोग किया जाता है हूँ।

2

मैं सिंगलटन में allocWithZone का उपयोग करता हूं। जैसा कि फोरेस्ट ने उल्लेख किया है, स्मृति के उसी क्षेत्र से आवंटित चर। इस प्रकार अन्य वर्ग स्मृति के उसी क्षेत्र से उनका उपयोग या उपयोग कर सकते हैं। जब आप अपना ऐप चलाते हैं तो मेमोरी स्पेस सहेजें।

27
से एप्पल के documentation

:

इस विधि ऐतिहासिक कारणों के लिए मौजूद है, मेमोरी जोन अब उद्देश्य-सी द्वारा उपयोग नहीं किए जाते हैं।

2

Foundation Functions Reference में, Zone कार्यों के सभी अब नीचे चेतावनी है कि क्षेत्र नजरअंदाज कर दिया जाएगा के साथ आरंभ कर रहे हैं।

ओएस एक्स पर आईओएस और 64-बिट रनटाइम पर ज़ोन को अनदेखा किया जाता है। आपको वर्तमान विकास में जोन का उपयोग नहीं करना चाहिए।

NSCreateZone 
NSRecycleZone 
NSSetZoneName 
NSZoneCalloc 
NSZoneFree 
NSZoneFromPointer 
NSZoneMalloc 
NSZoneName 
NSZoneRealloc 
NSDefaultMallocZone 
0

एप्पल के प्रलेखन इंगित करता है कि allocWithZone:

ऐतिहासिक कारणों से मौजूद है यहां तक ​​कि अगर; मेमोरी जोन अब उद्देश्य-सी द्वारा उपयोग नहीं किए जाते हैं। आपको इस विधि को ओवरराइड नहीं करना चाहिए।

और

क्षेत्र iOS पर ध्यान नहीं दिया जाता और ओएस एक्स पर 64-बिट क्रम आप वर्तमान विकास में ज़ोन का उपयोग नहीं करना चाहिए।

वास्तव में मैं एक ऑब्जेक्टिव-सी वर्ग (एक पूर्ण ऑब्जेक्टिव-सी परियोजना में) में यह अधिरोहित और विधि कहा जाता है जब मैं [[Mylass alloc] init] करना भले ही निर्माण एक iPhone 6s पर चल रहा है।

लेकिन मुझे लगता है कि दस्तावेज़ीकरण का पालन करना बेहतर है और इस के बजाय alloc विधि ओवरराइड करें क्योंकि आवंटन निश्चित रूप से एक ही काम कर सकता है।