यहां कोड है जिसका मैं उल्लेख कर रहा हूं।किसी ऑब्जेक्ट की बनाए रखने की गिनती क्या बढ़ जाती है?
// Person.h
@interface Person : NSObject {
NSString *firstName;
NSString *lastName;
}
@end
// Person.m
@implementation Person
- (id)init {
if (![super init]) return nil;
firstName = @"John";
lastName = @"Doe";
}
@end
// MyClass.m
@implementation MyClass
.....
- (NSArray *)getPeople {
NSMutableArray *array = [[NSMutableArray alloc] init];
int i;
for (i = 0; i < 10; i++) {
Person *p = [[Person alloc] init];
[array addObject:p];
}
return array;
}
.....
@end
अब, मुझे पता है कि इस नमूना कोड में कोई मेमोरी-प्रबंधन नहीं चल रहा है। क्या आवश्यक होगा?
getPeople लूप में, मैं एक व्यक्ति (retainCount 1) आवंटित कर रहा हूं, फिर इसे सरणी में जोड़ रहा हूं। बरकरार गिनती अब 2 है, है ना? यदि यह दो है, तो क्या मुझे इसे सरणी में जोड़ने के बाद [पी रिलीज़] करना चाहिए, जिससे retainCount वापस 1 तक लाया जा सकता है?
क्या मैं सही हूं कि यह विधि द्वारा लौटाए गए सरणी को जारी करने के लिए कॉलर की ज़िम्मेदारी है? (जो व्यक्ति की यादों को भी मुक्त करेगा, और उनके उदाहरण चर, यह मानते हुए कि उनकी गणना 1 है)।
मैंने ऐप्पल के मेमोरी प्रबंधन दस्तावेज़ को पढ़ा है, लेकिन मुझे लगता है कि मैं सबसे अस्पष्ट हूं, क्या वस्तुओं को गिनती बरकरार रखती है? मुझे लगता है कि मैं इस विचार को समझता हूं कि रिलीज करना किसकी ज़िम्मेदारी है। यह मौलिक नियम है एप्पल के अनुसार:
यदि आप इसे एक विधि जिसका नाम "alloc" या "नया" के साथ शुरू होता या "कॉपी" (उदाहरण के लिए, alloc शामिल का उपयोग कर बनाते हैं तो आप एक वस्तु का स्वामित्व लेने , newObject, या mutableCopy), या यदि आप इसे एक सतत संदेश भेजते हैं। रिलीज या ऑटोरेलीज का उपयोग कर अपने स्वामित्व वाली वस्तुओं के स्वामित्व को छोड़ने के लिए आप ज़िम्मेदार हैं। किसी भी अन्य वस्तु को आप ऑब्जेक्ट प्राप्त करते हैं, आपको इसे रिलीज़ नहीं करना चाहिए।
बॉब डेविल की वाक्य "केवल उस आइटम को बनाए रखने के बारे में चिंता करें जिसे आप स्पष्ट रूप से आइटम में जोड़ते हैं" ने इसे मेरे लिए क्लिक किया। ऐप्पल में स्वामित्व नीति पढ़ने के बाद, अनिवार्य रूप से, ऑब्जेक्ट/विधि जिसने नई वस्तु बनाई है, वह इसे जारी करने/इसमें रुचि रखने के लिए ज़िम्मेदार है। क्या ये सही है?
अब, मान लें कि मैं एक विधि प्राप्त करता हूं, जो ऑब्जेक्ट प्राप्त करता है, और इसे आवृत्ति चर में निर्दिष्ट करता है। मुझे प्राप्त वस्तु को सही रखने की आवश्यकता है, क्योंकि मुझे अभी भी इसमें रूचि है?
यदि इनमें से कोई भी गलत है, तो मुझे बताएं।
जोश का कहना है कि एनएसएमयूटेबलएरे को डिफ़ॉल्ट रूप से ऑटोरेलीज़ के लिए चिह्नित किया गया है? –
आपको अपने द्वारा बनाए गए ऑब्जेक्ट को स्पष्ट रूप से स्वतः ही करना होगा। – mjhoy