कोको और कोको-टच में सम्मेलन द्वारा, [[SomeClass alloc] initX]
या [SomeClass newX]
का उपयोग करके बनाई गई कोई भी वस्तु एक की एक सतत गणना के साथ बनाई गई है। जब आप अपने नए उदाहरण के साथ होते हैं, तो आमतौर पर विधि में [someClassInstance release]
पर कॉल करने के लिए आप ज़िम्मेदार हैं।
जहां इस मुश्किल हो जाता है जब आप एक संपत्ति के बजाय का एक उदाहरण चर के लिए अपने नए वस्तु सौंपते हैं। अधिकांश गुणों को retain
या copy
के रूप में परिभाषित किया गया है, जिसका अर्थ है कि वे सेट करते समय ऑब्जेक्ट की बनाए रखने की गिनती को बढ़ाते हैं, या ऑब्जेक्ट की एक प्रति बनाते हैं, जिससे मूल छूटे हुए होते हैं।
अपने उदाहरण में, आप शायद अपनी .h
फ़ाइल में इस है:
@property (retain) MyObject *editMyObject;
अपने पहले उदाहरण में
तो:
// (2) property setter increments retain count to 2
self.editMyObject =
// (1) new object created with retain count of 1
[[MyObject alloc] init];
// oops! retain count is now 2
आप alloc
/init
का उपयोग कर MyObject
के अपने नए उदाहरण बनाते हैं, यह एक की गिनती गिनती है। जब आप self.editMyObject
को नया उदाहरण असाइन करते हैं, तो आप वास्तव में -setEditMyObject:
विधि है कि संकलक जब आप @synthesize editMyObject
के लिए बनाता है कॉल कर रहे हैं। जब संकलक self.editMyObject = x
देखता है, तो यह [self setEditMyObject: x]
के साथ बदल देता है।
अपने दूसरे उदाहरण में:
MyObject *temp = [[MyObject alloc] init];
// (1) new object created with retain count of 1
self.editMyObject = temp;
// (2) equivalent to [self setEditMyObject: temp];
// increments retain count to 2
[temp release];
// (3) decrements retain count to 1
आप अपने नए काफी देर तक इसे जारी करने की वस्तु पर पकड़ है, तो बनाए रखने गिनती संतुलित किया जाता है (यह मानते हुए आप अपने dealloc
विधि में इसे जारी)।
भी देखें Cocoa strategy for pointer/memory management
स्रोत
2009-03-05 00:37:27
तीन अच्छे उत्तरों। ध्यान दें कि उत्तर देने के लिए भी कौन है। – 4thSpace