2010-08-31 6 views
6

मैं सिर्फ Facebook iOS SDK डाउनलोड किया है और मैंने देखा है कि नमूना कोड है कि एसडीके जब भी यह फेसबुक वर्ग इसे इस तरह यह करता है का एक उदाहरण बनाता है के साथ आता है में:'myObj = [[[[MyClass alloc] init] autatlease] का प्रभाव] बनाए रखें;'?

_facebook = [[[[Facebook alloc] init] autorelease] retain]; 

जहां _facebook एक सदस्य चर रहा है कॉलिंग ऑब्जेक्ट (यानी स्थानीय चर नहीं)।

कोई भी बता सकता है कि ऑटोरेलीज़िंग का बिंदु क्या है और फिर इसे बनाए रखना क्या है?

+3

उम, क्या है ??? –

+2

हम्म, मुझे लगता है कि मैं बेहतर फेसबुक ऐप को अनइंस्टॉल कर दूंगा। वे स्पष्ट रूप से समझ में नहीं आता कि वे क्या कर रहे हैं। – JeremyP

उत्तर

13

यह प्रभावी रूप से कुछ चक्र और स्मृति का उपभोग करने से परे कुछ भी नहीं करता है।

या, ठीक से, एक सही ढंग से लिखित आवेदन में, यह कुछ भी नहीं करता है। गलत तरीके से लिखित आवेदन में, यह _facebook ऑब्जेक्ट के जीवनकाल को बढ़ाकर एक बग मास्क कर सकता है। हालांकि, यह एक वास्तविक फिक्स नहीं है।

मुझे http://github.com/facebook/facebook-ios-sdk/blob/master/sample/DemoApp/Classes/DemoAppViewController.m में कोड की एक समान पंक्ति मिली है, यदि आप इसका जिक्र कर रहे हैं, तो हाँ, यह बकवास है।

+8

वैकल्पिक सिद्धांत यह है कि यह समझने के बिना यादों का एक लक्षण है। "ऑब्जेक्ट बनाने के लिए, मुझे [[[className alloc] init] autorelease लिखना होगा; इसे पकड़ने के लिए; मुझे इसे बरकरार रखना चाहिए। "केवल कथन का लेखक निश्चित रूप से जानता है। –

+0

उस फ़ाइल पर चलने वाला दोष इसे एक देव को गुणित करता है, शायद किसी को गिथब पर स्पष्टीकरण मांगने के लिए एक ईमेल भेजना चाहिए;) http://github.com/facebook/facebook-ios-sdk/blame/master/sample/DemoApp/Classes /DemoAppViewController.m – Shazron

+0

हाँ, मैंने यही सोचा था ... लेकिन "आधिकारिक" फेसबुक एसडीके में होने के नाते मैंने सोचा कि मूल डेवलपर कुछ ऐसा जानता था जो मैंने नहीं किया था, इसलिए मुझे लगा कि मैं पूछूंगा। आपके सहयोग के लिए धन्यवाद। – filipe

1

हालांकि यह संभव है कि आपको जो कोड मिला वह सिर्फ मैला था, उस पैटर्न का अर्थ है।

"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]; 
} 
+0

बस स्पष्ट होने के लिए, यह निश्चित रूप से * नहीं है * कभी भी लिखने के लिए सम्मेलन '[[[[[MyClass alloc] init] autorelease] बनाए रखें] '। इसके बजाय यह उपरोक्त '+ make_new_thing' विधि के लिए एक ऑटोरेलेज्ड ऑब्जेक्ट (यानी, 'वापसी [[[MyClass alloc] init] autorelease]' का एक बिल्कुल नया उदाहरण वापस करने के लिए सम्मेलन होगा और पुराने को संदर्भित नहीं करेगा। यह "खराब" विधि बनाने के लिए बहुत खराब डिज़ाइन होगा जो प्रत्येक कॉल पर पहले बनाए गए ऑब्जेक्ट्स को संभावित रूप से डिलीकेट कर सकता है। – Sean

+0

हां, मैंने जो उदाहरण दिया वह बहुत कृत्रिम था। हालांकि यह "सही" है। मेरी make_new_thing विधि "रिलीज" कहती है क्योंकि यह इसे "my_copy_of_thing" संदर्भ दे रही है। इस प्रकार उन वस्तुओं के लिए कोई अन्य संदर्भ नहीं होने पर ही "पहले बनाए गए ऑब्जेक्ट्स को हटा दिया जाता है"। –

+0

क्षमा करें, लेकिन नहीं, यह वास्तव में सही नहीं है। तथ्य यह है कि किसी को '... alloc] init] autorelease] रखना होगा]' एक संकेत है कि डिज़ाइन * स्वयं * गलत है। इस तरह की कार्यक्षमता को डिजाइन करने के बेहतर तरीके हैं जो बनाने की विधि से पागल स्मृति प्रबंधन और विचित्र साइड इफेक्ट्स से बचेंगे। – Sean

संबंधित मुद्दे