5

मान लें कि मेरे पास "foo" नामक एक ऑब्जेक्ट है जिसका नाम "बार" नामक अन्य ऑब्जेक्ट है।उद्देश्य-सी: क्या आपको मूल वस्तु को हटाने से पहले संपत्ति वस्तुओं को हटाना होगा?

जब "foo" deallocates, क्या यह स्वचालित रूप से "बार" के सभी संदर्भों को हटा देगा ताकि "बार" भी नष्ट हो जाए? या स्मृति में कहीं भी "foo" deallocate और "bar" फ्लोट करेगा? भले ही सभी "बार" संदर्भों को "foo" में परिभाषित किया गया हो।

अग्रिम धन्यवाद।

उत्तर

15

तो foo वस्तु किसी पर बरकरार रखती है या (धन्यवाद डेव) bar की प्रतियां है, उदाहरण के लिए जब आप संपत्ति इनमें से किसी एक के रूप में घोषित पुनःआवंटन foo:

- (void)dealloc 
{ 
    [bar release]; 

    [super dealloc]; 
} 

प्रणाली होगा आप के लिए मुफ्त नहीं bar की स्मृति स्थान जब तक आप इसे करने के लिए सभी संदर्भों से छुटकारा पाने के (यानी संदर्भ गिनती 0 करने के लिए नीचे चला जाता है) तो, आपको अपने संदर्भ संख्याओं और वस्तुओं को स्वयं निगरानी करना होगा।

+2

+1 यदि आपको संपत्ति को 'प्रतिलिपि' के रूप में घोषित किया गया है तो आपको भी रिलीज़ करना होगा। –

2

यदि आप स्मृति आवंटित करते हैं तो आपको इसे जारी करना होगा। तो, हां, में [bar release] या self.bar = nil पर कॉल करें (यदि आप संश्लेषित गुणों का उपयोग कर रहे हैं और यह सब कुछ)।

See here आईओएस पर स्मृति प्रबंधन के लिए एक परिचय के लिए।

@property (nonatomic, retain) NSString *bar; 
// Or 
@property (nonatomic, copy) NSString *bar; 

जब आप bar जारी करने के लिए की आवश्यकता होगी:

+1

'बार = nil' में 'self.bar = nil या [bar release] उपयोग करने के लिए इसे काट नहीं होगा की आवश्यकता होगी, से को समाप्त करता है, आप का उपयोग करने के' आवश्यकता होगी self.bar = nil' या '[आत्म setBar: शून्य] 'वास्तव में लक्ष्य वस्तु को छोड़ने के लिए। हालांकि, '-dealloc' में 'self' पर विधियों को कॉल करना एक बुरा विचार है, इसलिए इसके बजाय '[बार रिलीज़]' पर कॉल करें। –

+0

हाँ क्षमा करें आप सही हैं, 'self.bar = nil'। ऐप्पल दस्तावेज़ और नमूना कोड अक्सर 'self.prop = nil' करता है ... लेकिन मैं ज्यादातर सहमत हूं। – rfunduk

0

ऑब्जेक्ट ए अन्य वस्तुओं (ऑब्जेक्ट बी, ऑब्जेक्ट सी, इत्यादि) को किसी भी संदर्भ को जारी करने के लिए ज़िम्मेदार है जब इसे हटाया जाता है - यह स्वचालित रूप से नहीं होता है।

इस वस्तु पर -dealloc विधि से किया जाता है:

- (void)dealloc 
{ 
    [propertyB release]; 
    [propertyC release]; 
    [super dealloc]; 
} 

(या यदि गुण पढ़ने/लिखने और retain के रूप में चिह्नित कर रहे हैं, तो आप [self setPropertyB:nil] स्थानापन्न कर सकते हैं, आदि)।

तो क्या होगा जब ऑब्जेक्ट ए के सभी संदर्भ दूर हो जाएंगे, यह बदले में, गुणों बी और सी पर संदर्भ गणना को कम कर देता है। यदि उन ऑब्जेक्ट्स केवल ऑब्जेक्ट ए के स्वामित्व में हैं, तो वे भी समाप्त हो जाएंगे परिणामस्वरूप हटा दिया जा रहा है।

(यह आपके द्वारा टैग किए गए सभी आईफोन ओएस विकास के बारे में सच है। मुझे लगता है कि आप मैक पर कचरा-एकत्रित वातावरण के बारे में बात नहीं कर रहे हैं, जिसमें विभिन्न नियम और व्यवहार हैं और कुछ चीजें स्वचालित रूप से करती हैं।)

0

self.bar = nil का उपयोग करने का बड़ा कारण यह होगा कि यदि बार एक निब फ़ाइल के भीतर बनाया गया दृश्य देखने का संदर्भ था। उस स्थिति में, उस -(void)viewDidUnload में उस पंक्ति को शामिल किया जाएगा, क्योंकि इससे सिस्टम उस ऑब्जेक्ट को रिलीज़ कर देगा जब दृश्य को बाहर कर दिया जाता है। यदि दृश्य वापस आता है तो इसे nib फ़ाइल के माध्यम से पुनः लोड किया जाएगा। यह नहीं, हालांकि, एक -(void) dealloc

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