हालांकि यह संभव है कि आपको जो कोड मिला वह सिर्फ मैला था, उस पैटर्न का अर्थ है।
"alloc, autorelease, को बनाए रखने" का तात्पर्य है कि वस्तु दो स्थानों में संदर्भित है: (
- कॉल स्टैक पर वापसी मूल्य (autorelease शैली)
- अमेरिकन प्लान एसडीके अपने आप से के रूप में ' बनाए रखें ')
यह महत्वपूर्ण है कि दो संदर्भ स्वतंत्र रूप से जारी किए जा सकते हैं। उदाहरण के लिए, अगर एसडीके अपना संदर्भ जारी कर सकता है तो कॉल स्टैक पूरा हो गया है और ऑटोरेलीज पूल को निकाला गया है। ठीक है, यह बहुत अच्छा है; मेरा क्या मतलब है?
इन मामलों पर विचार करें:
ए) वास्तविक कोड
_facebook = [[[[Facebook alloc] init] autorelease] retain];
_facebook अब 2 की गिनती को बनाए रखने की है, और उम्मीद है 2 कॉल करने के लिए 'रिलीज': जो कोई भी कहा जाता है से 1 " बनाए रखें ", और 1 भविष्य में किसी बिंदु पर जब NSAutoreleasePool नालियों।
बी) सरल "वैकल्पिक" प्रस्तावित (नहीं के बराबर)
_facebook = [[Facebook alloc] init];
_facebook 1 की गिनती को बनाए रखने की है और जब 'रिलीज' (संभावित एक बड़ी समस्या है, तो कहा जाता है नष्ट कर दिया जाएगा ऑटोरेलीज पूल अभी तक नहीं निकला है और कॉल स्टैक अभी भी ऑब्जेक्ट का उपयोग कर रहा है)
यह क्यों मायने रखता है? इस तरह के कुछ कोड की कल्पना करें:
@implementation (Thinger)
+(id) make_new_thing
{
return my_copy_of_thing = [[[[Thing alloc] init] autorelease] retain];
}
+(id) forget_about_thing
{
if (my_copy_of_thing != nil) {
[my_copy_of_thing release];
my_copy_of_thing = nil;
}
}
@end
void foo() {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
id thing = [Thinger make_new_thing];
[Thinger forget_about_thing];
...
[thing useThing]; // implementation B would break here !
[pool drain];
}
स्रोत
2012-06-24 05:14:40
उम, क्या है ??? –
हम्म, मुझे लगता है कि मैं बेहतर फेसबुक ऐप को अनइंस्टॉल कर दूंगा। वे स्पष्ट रूप से समझ में नहीं आता कि वे क्या कर रहे हैं। – JeremyP