2016-01-21 5 views
30

handlerUIAlertAction को बंद करते समय, self का संदर्भ मजबूत (डिफ़ॉल्ट), weak, या unowned होना चाहिए?क्या यूआईएलर्टएक्शन के हैंडलर में स्वयं को मजबूत के रूप में पकड़ा जाना चाहिए?

इस विषय (1, 2, 3, 4) के लिए प्रासंगिक पदों किया गया है, लेकिन मैं ईमानदारी से नहीं दिख रहा है कि वे किस तरह इस मामले में मदद करते हैं। इस विशिष्ट कोड पर

आइए फोकस:

func tappedQuitButton() { 
    let alert = UIAlertController(title: "Confirm quit", message: nil, preferredStyle: .ActionSheet) 

    let quitAction = UIAlertAction(title: "Quit", style: .Default) { (action) in 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
    alert.addAction(quitAction) 

    let cancelAction = UIAlertAction(title: "Cancel", style: .Default) { (action) in 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
    alert.addAction(cancelAction) 

    presentViewController(alert, animated: true, completion: nil) 
} 

यह एक UIViewController उपवर्ग के अंदर एक समारोह है, इसलिए self चेतावनी पेश दृश्य नियंत्रक है।

documentation का कहना है:

कि संदर्भ अपने जीवन में कुछ बिंदु पर "कोई मूल्य नहीं" के लिए के लिए एक कमजोर संदर्भ का उपयोग संदर्भ चक्र से बचने के लिए जब भी यह संभव है। यदि संदर्भ हमेशा एक मान होगा, इसके बजाय एक अज्ञात संदर्भ का उपयोग करें।

मैं अंधेरा हो सकता हूं, लेकिन मुझे अभी भी यह नहीं दिख रहा है कि यह UIAlertAction के बारे में मेरे प्रश्न का उत्तर देने में कैसे मदद करता है।

उपर्युक्त कोड में, के लिए अपने जीवन पर किसी बिंदु पर यह संभव है? हाँ। तो मुझे self को weak के रूप में चिह्नित करना चाहिए।

लेकिन फिर, मैं एक व्यावहारिक परिदृश्य के बारे में नहीं सोच सकता जहां self बंद होने पर शून्य हो जाएगा। तो जहां तक ​​उस बंद होने का संबंध है, selfहमेशा एक मूल्य होगा। तो मुझे self को unowned के रूप में चिह्नित करना चाहिए।

तो, फिर, self को UIAlertAction के हैंडलर में कैप्चर किया जाना चाहिए?

उत्तर

40

खुद से पूछने का मुख्य सवाल यह है कि यदि आपकी अलर्ट ऑब्जेक्ट स्वयं "स्वामित्व" है। इस मामले में, यह नहीं है (क्योंकि आपने फ़ंक्शन बॉडी में let alert = ... घोषित किया है)। तो आपको इसे कमजोर या अप्रत्याशित संदर्भ के रूप में बनाने की आवश्यकता नहीं है।

यदि अलर्ट स्वयं की संपत्ति थी, तो यह स्वयं द्वारा "स्वामित्व" होगा और यह तब होगा जब आप अलर्ट द्वारा "स्वामित्व" बंद करने में स्वयं के लिए एक कमजोर संदर्भ बनाना चाहते हैं।

+0

मुझे "स्वामित्व" के संदर्भ में इसे देखने में कठिन समय है। इंस्टेंस द्वारा "स्वामित्व" के उदाहरण विधि में स्थानीय चर क्यों नहीं हैं ..? – Eric

+3

स्थानीय चर ढेर पर आवंटित किए जाते हैं ... और केवल स्टैक/फ़ंक्शन के जीवनकाल के लिए ही रहेंगे। एक बार जब आप इसे बना लेते हैं, तो यह उस समय के कार्यकाल के दायरे से बाहर हो जाने के बाद अपने जीवनकाल को प्रबंधित करने के लिए प्रस्तुत करने वाले दृश्य नियंत्रक पर निर्भर करता है। इस मामले में अलर्ट को स्वयं पर पकड़ने की आवश्यकता होती है, लेकिन स्वयं को कम ख्याल रखना चाहिए एक बार फ़ंक्शन को कॉल करने के बाद अलर्ट, कुछ और (प्रस्तुत करने वाला दृश्य नियंत्रक) इसका ख्याल रखता है। –

+0

इसलिए, यदि अलर्ट एक स्थानीय चर है तो स्वयं को एक मजबूत संदर्भ रखना हमेशा ठीक है, अन्यथा अगर चेतावनी एक संपत्ति है तो उसे स्वयं को कमजोर संदर्भ रखना चाहिए। सही बात? – Eric

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

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