/ / मेथड रिटर्निंग ऑब्जेक्ट एग्जीक्यूटफ्रीचर्सपेस्ट - ऑब्जेक्टिव-सी, कोर-डेटा

ExecuteFetchRequest - उद्देश्य-सी, कोर-डेटा के साथ ऑब्जेक्ट लौटने वाला ऑब्जेक्ट

मैंने पिछले कुछ घंटों में मेमोरी मैनेजमेंट के विषय पर दर्जनों पोस्ट पढ़ीं, जिनका उद्देश्य ऑब्जेक्टिव-सी था और मैंने अभी इसे नहीं किया। क्षमा करें। मैं अपना सर्वश्रेष्ठ कर रहा हूं।

इस समय मैं जिस चीज की तलाश कर रहा हूं, वह यह है कि किसी ऐसी विधि से किसी वस्तु को कैसे लौटाया जाए, जो "निष्पादित करें"।

यहाँ कुछ कोड है ...

+ (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

// Set filter predicate
NSString *strFilter = [NSString stringWithFormat:@"%@ = %d", name, index];
[request setPredicate:[NSPredicate predicateWithFormat:strFilter]];

// Create the sort descriptors array
NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:name ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sorter]];

NSError *error = nil;
Player *player = nil;
NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];
if ([array count] == 1)
{
player = [array objectAtIndex:0];
//[player retain]; // ???
}

[request release];

return player;
}

लेकिन जिस चीज की मुझे वास्तव में जरूरत है, वह है "प्लेयर" ऑब्जेक्ट के लिए विधि रिटर्न के बाद चारों ओर चिपकना।

वापस आने के बाद मैं "खिलाड़ी" को कैसे जीवित कर सकता हूं?

क्या मुझे "रिटेन" कहना चाहिए? (और फिर मैं रिसीवर में "रिलीज" कहूंगा) क्या मुझे ऑब्जेक्ट को "कॉपी" करना चाहिए?

मैंने आवंटित, कॉपी, नए, आदि के बारे में अन्य सभी पदों को पढ़ा।

मुझे बस एक सरल उदाहरण की आवश्यकता है ताकि मैं इसके बारे में समझ हासिल कर सकूं। यदि आप मुझे इस विधि को कॉल करने वाले रिसीवर का उदाहरण भी दिखा सकते हैं तो मैं इसकी सराहना करूंगा।

धन्यवाद!

उत्तर:

उत्तर № 1 के लिए 1

आप प्रतिलिपि का उपयोग कर सकते हैं, लेकिन इसके लिए आवश्यक होगा कि Player वर्ग के अनुरूप है NSCopying प्रोटोकॉल, जो मुझे संदेह है कि यह करता है।

यहाँ ऐसा करने का सबसे सरल (और शायद सबसे अच्छा) तरीका इस प्रकार है:

if ([array count] == 1)
{
player = [[array objectAtIndex:0] retain];
}

[request release];

return [player autorelease];

आप खिलाड़ी को रिटेन करके इस बीच रिलीज़ होने से रोक रहे हैं, और फिर जब आप इसे वापस लेते हैं तो आप इसका उपयोग करते हैं autorelease। यह कड़ाई से आवश्यक नहीं है, लेकिन मुझे लगता है कि यह इस मामले में अच्छा प्रोग्रामिंग अभ्यास है। इसकी वजह है आपकी

+ (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index;

फ़ंक्शन नाम का अर्थ होगा (ओब्ज-सी मानक अभ्यास में) जो ऑब्जेक्ट लौटाया गया है वह ऑटोरेलिज्ड है, इस प्रकार कॉल करने वाले तक ऑब्जेक्ट के मेमोरी प्रबंधन को छोड़ दिया जाता है।

उस कक्षा में जिसे आप कहते हैं + (Player *)loadPlayerWithPredicate:(NSString *)name:(NSInteger)index, यदि आप चाहते हैं तो आपको यह निर्धारित करना होगालौटे हुए प्लेयर को बनाए रखें (जैसे कि इसे एक प्रॉपर्टी में सेट करना), या यदि आप इसे छोड़ना चाहते हैं (ऑटोरेलिज्ड, और इस प्रकार यह कॉल समाप्त होने की विधि के बाद संभवत: जारी हो जाएगा। यदि आपको केवल आवश्यकता हो तो इसका उपयोग करें। इसके साथ तुरंत कुछ क्रियाएं करें और "इसके बाद इसे धारण करने की आवश्यकता नहीं है"।