खोज…


स्वचालित संदर्भ गणना

स्वत: संदर्भ गणना (एआरसी) के साथ, कंपाइलर आवेषण को 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];
}

मैन्युअल संदर्भ गिनती का उपयोग करते समय स्मृति प्रबंधन नियम।

ये नियम केवल तभी लागू होते हैं जब आप मैन्युअल संदर्भ गिनती का उपयोग करते हैं!

  1. आपके द्वारा बनाई गई कोई भी वस्तु आपकी अपनी है

    एक विधि है जिसका नाम के साथ शुरू होता फोन करके alloc , new , copy या mutableCopy । उदाहरण के लिए:

    NSObject *object1 = [[NSObject alloc] init];
    NSObject *object2 = [NSObject new];
    NSObject *object3 = [object2 copy];
    

    इसका मतलब है कि आप इन वस्तुओं को जारी करने के लिए जिम्मेदार हैं जब आप उनके साथ किए जाते हैं।

  2. आप रिटेन का उपयोग करके किसी ऑब्जेक्ट का स्वामित्व ले सकते हैं

    किसी ऑब्जेक्ट के लिए स्वामित्व रखने के लिए आप अनुरक्षण विधि कहते हैं।

    उदाहरण के लिए:

    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;
    }
    
  3. जब आपको इसकी आवश्यकता नहीं रह जाती है, तो आपको अपने स्वामित्व वाली वस्तु के स्वामित्व को त्यागना होगा

    NSObject* object = [NSObject new]; // The retain count is now 1
    [object performAction1]; // Now we are done with the object
    [object release]; // Release the object
    
  4. आपको उस वस्तु का स्वामित्व नहीं छोड़ना चाहिए जो आपके पास नहीं है

    इसका मतलब है कि जब आप किसी वस्तु का स्वामित्व नहीं लेते हैं तो आप उसे जारी नहीं करते हैं।

  5. 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;
    }
    

    ऑटोरेलिसपूल ब्लॉकों का उपयोग करना आवश्यक है क्योंकि आपके पास कभी-कभी ऐसी वस्तुएं होती हैं जो आपके पास नहीं होती हैं (चौथा नियम हमेशा लागू नहीं होता है)।

    स्वचालित संदर्भ की गिनती स्वचालित रूप से नियमों का ध्यान रखती है, इसलिए आपके पास नहीं है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow