ऑब्जेक्टिव सी - असाइन, कॉपी, रिटेन


83

मैं ऑब्जेक्टिव सी के लिए नया हूं। मुझे सी में बेसिक नॉलेज है, जिसमें पॉइंटर्स का कॉन्सेप्ट भी शामिल है। मेरे दो बुनियादी प्रश्न हैं:

  1. क्या कोई किसी सादृश्य के साथ असाइन, कॉपी और रिटेन के बीच अंतर समझा सकता है?
  2. आप एक फ़ंक्शन को कैसे संभालते हैं जो पॉइंटर वेरिएबल देता है, और आप रिटर्न पॉइंटर के माध्यम से मैसेजिंग कैसे करते हैं?

जवाबों:


126

परिवर्तित दस्तावेज़ के लिए अद्यतन उत्तर

जानकारी अब प्रलेखन में कई गाइडों में फैली हुई है। यहाँ आवश्यक पढ़ने की एक सूची है:

इस सवाल का जवाब अब पूरी तरह से इस बात पर निर्भर करता है कि आप ARC- प्रबंधित एप्लिकेशन (नई परियोजनाओं के लिए आधुनिक डिफ़ॉल्ट) का उपयोग कर रहे हैं या मैन्युअल मेमोरी प्रबंधन के लिए मजबूर हैं।

असाइन बनाम कमजोर - किसी संपत्ति के संकेतक को बनाए रखने के लिए उसे बनाए रखने या अन्यथा इसे क्यूरेट किए बिना उपयोग करने के लिए असाइन करें ; संपत्ति को इंगित करने के लिए कमजोर का उपयोग करें स्वचालित रूप से शून्य करने के लिए यदि इसे सौंपी गई वस्तु को निपटाया जाता है। यदि आप उचित सफाई नहीं करते हैं, तो ज्यादातर मामलों में आप कमजोर का उपयोग करना चाहते हैं, इसलिए आप एक अस्वीकृत वस्तु (मेमोरी पते की अवैध पहुंच) का उपयोग करने की कोशिश नहीं कर रहे हैं EXC_BAD_ACCESS

रिटेन बनाम कॉपी - घोषित गुण डिफ़ॉल्ट रूप से बनाए रखते हैं (इसलिए आप इसे पूरी तरह से छोड़ सकते हैं) और ऑब्जेक्ट की संदर्भ गणना को स्वचालित रूप से प्रबंधित करेंगे कि क्या कोई अन्य वस्तु संपत्ति को सौंपी गई है या यह शून्य पर सेट है; नव-निर्दिष्ट ऑब्जेक्ट को स्वचालित रूप से भेजने के लिए प्रतिलिपि का उपयोग करें -copy(जो पास की गई वस्तु की प्रतिलिपि बनाएगा और उस प्रतिलिपि को इसके बजाय संपत्ति में असाइन करेगा - उपयोगी (यहां तक ​​कि आवश्यक) कुछ स्थितियों में जहां असाइन की गई वस्तु को सेट होने के बाद संशोधित किया जा सकता है किसी अन्य वस्तु की संपत्ति (जिसका अर्थ होगा कि संशोधन / उत्परिवर्तन संपत्ति पर भी लागू होगा)।


2
धन्यवाद दोस्त मैं Apple देव से मूल बातें पढ़ता हूं, मेरे वर्तमान विकास पर स्मृति प्रबंधन में एक कठिन समय "objc_msgSend ()" में दुर्घटनाग्रस्त हो गया इसलिए मैंने गुणों पर अपनी समझ को संशोधित करने के बारे में सोचा। stackoverflow.com/questions/4506205/…
सभा B

2
बस एक सिर, उत्तर में लिंक सेब साइट पर एक सामान्य "पृष्ठ नहीं मिला" पर जाता है। फिर यह "मैक डेवलपर लाइब्रेरी" पर पुनर्निर्देश करता है। इस एसओ उत्तर में उपयोगी जानकारी है: stackoverflow.com/questions/2255861/…
hippeelee

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

33

मेमोरी मैनेजमेंट प्रोग्रामिंग गाइड आईओएस संदर्भ पुस्तकालय से, असाइन की मूल बातें है प्रतिलिपि बनाएँ, और उपमा और उदाहरण के साथ बरकरार रहती है।

प्रतिलिपि किसी ऑब्जेक्ट की प्रतिलिपि बनाता है, और इसे 1. की बनाए रखने की संख्या के साथ लौटाता है। यदि आप किसी ऑब्जेक्ट की प्रतिलिपि बनाते हैं, तो आप प्रतिलिपि के स्वामी हैं। यह किसी भी विधि पर लागू होता है जिसमें शब्द की प्रतिलिपि होती है जहां "प्रतिलिपि" उस ऑब्जेक्ट को संदर्भित करता है जिसे वापस लौटाया जा रहा है।

बनाए रखना 1. किसी वस्तु के रख-रखाव की संख्या को बढ़ाता है 1. किसी वस्तु का स्वामित्व लेता है।

रिलीज़ 1. किसी ऑब्जेक्ट की रिटेन काउंट को घटाता है। किसी ऑब्जेक्ट का स्वामित्व छोड़ देता है।


आपके उत्तर के लिए धन्यवाद। क्या आप कृपया स्पष्ट करें। 1. क्लासा के पास एक संपत्ति है - (कक्षा बी *) फ़ंक्शननाम; 2.ClassB विधि है - (शून्य) setHeight; 3.ClassC इंटरफ़ेस मैंने ClassA * tempA को बरकरार रखा है। 4. निर्माण सी में कार्यान्वयन I यह कथन ClassB * tempB = tempA.functionName; 5.जब मैं एक संदेश भेजने की कोशिश करता हूं (tempB। SetHeight?) TempB initialization की अगली लाइन पर मेरा प्रोग्राम ठीक काम करता है।
सभा बी

6. एक ही कथन (tempB। SetHeight;) को किसी फ़ंक्शन में डालना और उसी फ़ंक्शन को कॉल करने से मेरा प्रोग्राम objc_msgSend () में क्रैश हो जाता है।
सभा बी

8
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"First",@"Second", nil];
NSMutableArray *copiedArray = [array mutableCopy];
NSMutableArray *retainedArray = [array retain];

[retainedArray addObject:@"Retained Third"];
[copiedArray addObject:@"Copied Third"];

NSLog(@"array = %@",array);
NSLog(@"Retained Array = %@",retainedArray);
NSLog(@"Copied Array = %@",copiedArray);

array = (
    First,
    Second,
    "Retained Third"
)
Retained Array = (
    First,
    Second,
    "Retained Third"
)
Copied Array = (
    First,
    Second,
    "Copied Third"
)

2
आसपास के स्पष्टीकरण से आपके उत्तर में सुधार होगा।
20

4
  1. असाइन

    • असाइन एक डिफ़ॉल्ट गुण विशेषता है
    • असाइन करें एक गुण गुण संकलक को बताता है कि संपत्ति के सेटर कार्यान्वयन को कैसे संश्लेषित किया जाए
  2. कॉपी:

    • जब वस्तु परस्पर है तो प्रतिलिपि आवश्यक है
    • कॉपी एक ऐसी वस्तु देता है जिसे आपको गैर-कचरा एकत्र किए गए वातावरण में स्पष्ट रूप से जारी करना चाहिए (जैसे, डीललॉक में)
    • जब आप प्रतिलिपि बनाए रखते हैं, तो आपको इसके साथ समाप्त होने पर ऑब्जेक्ट को रिलीज़ करने की आवश्यकता होती है
  3. बनाए रखें:

    • निर्दिष्ट करता है कि नया मान असाइनमेंट पर "-चयन" और पुराने मूल्य "-release" भेजा जाना चाहिए
    • यदि आप लिखते हैं कि यह मजबूत की तरह ऑटो काम करेगा
    • "आवंटन" जैसी विधियों में एक निहित "रिटेन" शामिल है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.