2010-12-07 18 views
5
UIPopoverController *historyPop = [[UIPopoverController alloc] initWithContentViewController:nav]; 
    [nav release]; 
    [historyPop setPopoverContentSize:CGSizeMake(400, 500)]; 
    [historyPop presentPopoverFromRect:CGRectMake(button.frame.origin.x, button.frame.origin.y, button.frame.size.width, 5) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES]; 
    //[historyPop release]; 

यह मेरा वर्तमान कोड है, हालांकि विश्लेषक का कहना है कि शायद एक रिसाव है, जो वहां है (रिलीज लाइन पर टिप्पणी की गई है)। लेकिन अगर मैं रिलीज लाइन को अनदेखा करता हूं तो ऐप दुर्घटनाग्रस्त हो जाता है और कहता है कि पॉपओवर पर डेलोक पहुंच गया था, जबकि यह अभी भी दिखाई दे रहा है, तो जब मुझे पॉपओवर नियंत्रक को बिल्कुल जारी किया जाना चाहिए?UIPopoverController और मेमोरी प्रबंधन

उत्तर

5

जैसा कि कई स्थानों पर बताया गया है, एक पॉपओवर (या तो एक आयत से, या टूलबार बटन से) विधियों को पॉपओवर नहीं बनाए रखता है। इसलिए, आपके प्रस्तुत दृश्य नियंत्रक को इसका संदर्भ रखने की आवश्यकता है और उचित समय पर इसे जारी करना होगा।

आप प्रस्तुत करने वाले व्यू कंट्रोलर को पॉपओवर के प्रतिनिधि के रूप में सेट करके ऐसा कर सकते हैं। एक सरल, अगर थोड़ा कम स्मृति-कुशल, दृष्टिकोण UIPopoverController को पकड़ने के लिए एक बरकरार संपत्ति घोषित करना है। जब आप पॉपओवर बनाते हैं तो आप उसे संपत्ति को सौंप देते हैं, जो इसे बरकरार रखता है। यदि आप बाद में एक और पॉपओवर बनाते हैं, तो जब आप संपत्ति को पुन: असाइन करते हैं तो यह पिछले पॉपओवर को रिलीज़ करेगा। प्रस्तुति दृश्य नियंत्रक की डेलोक विधि (साथ ही viewDidUnload) में संपत्ति को रिलीज़ करना न भूलें।

यह दृष्टिकोण रिसाव नहीं होगा, और आपको प्रतिनिधियों से निपटने की आवश्यकता नहीं है। लेकिन, आप संभावित रूप से आवश्यक से अधिक समय तक UIPopoverController ऑब्जेक्ट को रखेंगे। यह निर्धारित करने के लिए आप पर निर्भर है कि यह आपके ऐप के लिए चिंता का विषय है या नहीं।

+0

प्रस्तुत करने वाले व्यू कंट्रोलर को UIPopoverController के प्रतिनिधि के रूप में सेट करना पॉपओवर नियंत्रक को बनाए रखता नहीं है। प्रतिनिधि का उपयोग करने का मुद्दा यह है कि जब आप 'popoverControllerDidDismissPopover:' कॉल प्राप्त करते हैं तो आप उचित रूप से पॉपओवर नियंत्रक को छोड़ सकते हैं। तो, दोनों करना सबसे अधिक समझ में आता है। –

+1

यह खूनी परेशान है कि वे प्रस्तुत करते समय बनाए नहीं रखते हैं, और यह अन्य समान तरीकों को पूरी तरह से बेदखल करता है (जैसे मॉडल विचार प्रस्तुत करना, सबव्यू जोड़ना) –

+0

नोट: यदि आप गैर-प्रतिनिधि मार्ग पर जाते हैं, तो आपको "[यूआईपीओवर कंट्रोलर dealloc] तब भी पहुंचा जब पॉपओवर अभी भी दिखाई दे रहा है "यदि उपयोगकर्ता पॉप-ओवर को खारिज कर देता है और तुरंत एक और पॉप-ओवर लोड करता है - पहले व्यक्ति को" गैर-दृश्यमान "पाने में समय लगता है और इसे समाप्त होने से पहले इसे हटा दिया जाएगा, एक दुर्घटना का कारण बनता है। – Jason

2

पॉपओवर को ऑटोरेलेज़ करने का प्रयास करें: [historyPop autorelease]presentPopoverFromRect पॉपओवर को बरकरार नहीं रखता है, इसलिए autorelease यहां काम नहीं करेगा। आपको अपनी कक्षा को पॉपओवर नियंत्रक के प्रतिनिधि के रूप में सेट करने की आवश्यकता है, और popoverControllerDidDismissPopover: में पॉपओवर को रिलीज़ करना होगा।

+0

वही त्रुटि होती है –

+2

क्षमा करें, मेरी गलती - 'presentPopoverFromRect' पॉपओवर को बरकरार नहीं रखता है, इसलिए autorelease यहां काम नहीं करेगा। आपको अपनी कक्षा को पॉपओवर नियंत्रक के प्रतिनिधि के रूप में सेट अप करने की आवश्यकता है, और 'पॉपओवर कंट्रोलरडिडडिस्मिसपोपर:' में पॉपओवर को रिलीज़ करना होगा। इस प्रश्न का दूसरा उत्तर देखें: http://stackoverflow.com/questions/2867709/retain-release-pattern-for-uipopovercontroller-uiactionsheet-and-modal-view-con – bosmacs

+0

शायद आपकी टिप्पणी को संपादित करने के लिए आपके उत्तर को संपादित करने लायक है, जैसा कि कोई भी उत्तर पढ़ता है लेकिन टिप्पणियों को नहीं गुमराह किया जाएगा –

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