Objective-C Language
स्मृति प्रबंधन
खोज…
स्वचालित संदर्भ गणना
स्वत: संदर्भ गणना (एआरसी) के साथ, कंपाइलर आवेषण को retain
, release
और autorelease
स्टेटमेंट्स की आवश्यकता होती है, जहां आपको उनकी आवश्यकता होती है, इसलिए आपको उन्हें स्वयं नहीं लिखना होगा। यह आपके लिए dealloc
विधियां भी लिखता है।
मैनुअल मेमोरी प्रबंधन से नमूना कार्यक्रम एआरसी के साथ इस तरह दिखता है:
@interface MyObject : NSObject {
NSString *_property;
}
@end
@implementation MyObject
@synthesize property = _property;
- (id)initWithProperty:(NSString *)property {
if (self = [super init]) {
_property = property;
}
return self;
}
- (NSString *)property {
return property;
}
- (void)setProperty:(NSString *)property {
_property = property;
}
@end
int main() {
MyObject *obj = [[MyObject alloc] init];
NSString *value = [[NSString alloc] initWithString:@"value"];
[obj setProperty:value];
[obj setProperty:@"value"];
}
एआरसी द्वारा संभाले गए संसाधनों को साफ करने के लिए आप अभी भी डीलॉक विधि को ओवरराइड करने में सक्षम हैं। मैनुअल मेमोरी प्रबंधन का उपयोग करते समय आप [super dealloc]
कॉल नहीं करते हैं।
-(void)dealloc {
//clean up
}
मजबूत और कमजोर संदर्भ
एक कमजोर संदर्भ इनमें से एक जैसा दिखता है:
@property (weak) NSString *property;
NSString *__weak variable;
यदि आपके पास किसी ऑब्जेक्ट का कमजोर संदर्भ है, तो हुड के नीचे:
- आप इसे बरकरार नहीं रख रहे हैं।
- जब इसे निपटाया जाता है, तो इसका प्रत्येक संदर्भ स्वतः
nil
सेट हो जाएगा
ऑब्जेक्ट संदर्भ हमेशा डिफ़ॉल्ट रूप से मजबूत होते हैं। लेकिन आप स्पष्ट रूप से निर्दिष्ट कर सकते हैं कि वे मजबूत हैं:
@property (strong) NSString *property;
NSString *__strong variable;
एक मजबूत संदर्भ का मतलब है कि जब वह संदर्भ मौजूद है, तो आप ऑब्जेक्ट को बनाए रख रहे हैं।
मैनुअल मेमोरी प्रबंधन
यह मैनुअल मेमोरी मैनेजमेंट के साथ लिखे गए प्रोग्राम का एक उदाहरण है। आपको वास्तव में इस तरह से अपना कोड नहीं लिखना चाहिए, जब तक कि किसी कारण से आप एआरसी का उपयोग नहीं कर सकते (जैसे यदि आपको 32-बिट का समर्थन करने की आवश्यकता है)। उदाहरण यह बताने के लिए कि आपको गेटर्स लिखने और बसने के लिए किस तरह का उपयोग करना था, यह बताने के लिए @property
अंकन से बचा जाता है।
@interface MyObject : NSObject {
NSString *_property;
}
@end
@implementation MyObject
@synthesize property = _property;
- (id)initWithProperty:(NSString *)property {
if (self = [super init]) {
// Grab a reference to property to make sure it doesn't go away.
// The reference is released in dealloc.
_property = [property retain];
}
return self;
}
- (NSString *)property {
return [[property retain] autorelease];
}
- (void)setProperty:(NSString *)property {
// Retain, then release. So setting it to the same value won't lose the reference.
[property retain];
[_property release];
_property = property;
}
- (void)dealloc {
[_property release];
[super dealloc]; // Don't forget!
}
@end
int main() {
// create object
// obj is a reference that we need to release
MyObject *obj = [[MyObject alloc] init];
// We have to release value because we created it.
NSString *value = [[NSString alloc] initWithString:@"value"];
[obj setProperty:value];
[value release];
// However, string constants never need to be released.
[obj setProperty:@"value"];
[obj release];
}
मैन्युअल संदर्भ गिनती का उपयोग करते समय स्मृति प्रबंधन नियम।
ये नियम केवल तभी लागू होते हैं जब आप मैन्युअल संदर्भ गिनती का उपयोग करते हैं!
आपके द्वारा बनाई गई कोई भी वस्तु आपकी अपनी है
एक विधि है जिसका नाम के साथ शुरू होता फोन करके
alloc
,new
,copy
याmutableCopy
। उदाहरण के लिए:NSObject *object1 = [[NSObject alloc] init]; NSObject *object2 = [NSObject new]; NSObject *object3 = [object2 copy];
इसका मतलब है कि आप इन वस्तुओं को जारी करने के लिए जिम्मेदार हैं जब आप उनके साथ किए जाते हैं।
आप रिटेन का उपयोग करके किसी ऑब्जेक्ट का स्वामित्व ले सकते हैं
किसी ऑब्जेक्ट के लिए स्वामित्व रखने के लिए आप अनुरक्षण विधि कहते हैं।
उदाहरण के लिए:
NSObject *object = [NSObject new]; // object already has a retain count of 1 [object retain]; // retain count is now 2
यह केवल कुछ दुर्लभ स्थितियों में समझ में आता है।
उदाहरण के लिए जब आप स्वामित्व लेने के लिए एक अभिगमकर्ता या एक init विधि लागू करते हैं:
- (void)setStringValue:(NSString *)stringValue { [_privateStringValue release]; // Release the old value, you no longer need it [stringValue retain]; // You make sure that this object does not get deallocated outside of your scope. _privateStringValue = stringValue; }
जब आपको इसकी आवश्यकता नहीं रह जाती है, तो आपको अपने स्वामित्व वाली वस्तु के स्वामित्व को त्यागना होगा
NSObject* object = [NSObject new]; // The retain count is now 1 [object performAction1]; // Now we are done with the object [object release]; // Release the object
आपको उस वस्तु का स्वामित्व नहीं छोड़ना चाहिए जो आपके पास नहीं है
इसका मतलब है कि जब आप किसी वस्तु का स्वामित्व नहीं लेते हैं तो आप उसे जारी नहीं करते हैं।
Autoreleasepool
ऑटोरेलिसेप्ल कोड का एक ब्लॉक है जो ब्लॉक में प्रत्येक वस्तु को रिलीज करता है जिसे ऑटोरेलिज संदेश प्राप्त होता है।
उदाहरण:
@autoreleasepool { NSString* string = [NSString stringWithString:@"We don't own this object"]; }
हमने स्वामित्व लेने के बिना एक स्ट्रिंग बनाई है।
NSString
विधिNSString
stringWithString:
यह सुनिश्चित करने के लिए है कि स्ट्रिंग को सही ढंग से डील किया गया है क्योंकि अब इसकी आवश्यकता नहीं है। इससे पहले कि विधि नए बनाए गए स्ट्रिंग को ऑटोरेलिज़ विधि कहती है ताकि उसे स्ट्रिंग का स्वामित्व लेने की आवश्यकता न हो।यह है कैसे
stringWithString:
लागू किया गया है:+ (NSString *)stringWithString:(NSString *)string { NSString *createdString = [[NSString alloc] initWithString:string]; [createdString autorelease]; return createdString; }
ऑटोरेलिसपूल ब्लॉकों का उपयोग करना आवश्यक है क्योंकि आपके पास कभी-कभी ऐसी वस्तुएं होती हैं जो आपके पास नहीं होती हैं (चौथा नियम हमेशा लागू नहीं होता है)।
स्वचालित संदर्भ की गिनती स्वचालित रूप से नियमों का ध्यान रखती है, इसलिए आपके पास नहीं है।