16

मैं अपना पहला ऐप लॉन्च करने के बारे में नया डेवलपर हूं।आईओएस 6 देखने का बहिष्कार WillUnload और करने के लिए स्थानांतरित करें MemoryWarning

iOS 6 में, UIViewController की viewWillUnload और viewDidUnload तरीके अब अनुचित हैं: मैं viewDidUnload की निंदा के रूप में एप्पल के आईओएस 6 रिलीज़ नोट में नीचे वर्णित के बारे में उलझन में हूँ। यदि आप डेटा को जारी करने के लिए इन विधियों का उपयोग कर रहे थे, तो इसके बजाय didReceiveMemoryWarning विधि का उपयोग करें। इस विधि का उपयोग नियंत्रक के दृश्य के संदर्भों को रिलीज़ करने के लिए भी कर सकता है यदि इसका उपयोग नहीं किया जा रहा है। आपको यह जांचने से पहले का परीक्षण करने की आवश्यकता होगी।

ऐसा क्यों हो रहा है? यह सुनिश्चित करने के लिए मुझे किन दिशानिर्देशों का पालन करना चाहिए कि इस परिवर्तन से मेरे ऐप में कोई प्रदर्शन समस्या नहीं आती है?

धन्यवाद।

+0

की तरह कुछ आप वर्तमान में अपने अनुप्रयोग में के लिए viewDidUnload उपयोग कर रहे हैं तो क्या करें? –

उत्तर

17

ऐप्पल के मुताबिक, उन्होंने viewWill/DidUnload में सामान को नष्ट कर हासिल किए गए लाभों को पर्याप्त रूप से देखने के लिए आंतरिक स्मृति प्रबंधन में सुधार किया है। इसके अलावा, उनके पास डेटा का सुझाव है कि कई ऐप्स क्रैश हो जाते हैं क्योंकि ऐप्स उन अधिसूचनाओं को सही तरीके से संभाल नहीं पाते हैं, और "अन्य" सामान दृश्य अनलोडिंग से जुड़े नहीं होते हैं।

अंत में, स्मृति स्मृति चेतावनी अब पहली और एकमात्र चेतावनी के रूप में सत्यापित की जाती है जो आपको कम स्मृति के कारण समाप्त होने से पहले प्राप्त होगी, इसलिए यह वास्तव में स्मृति समस्याओं को संभालने का स्थान है।

तो, मूल रूप से, बस अपने viewWillUnload और viewDidUnload विधियों को हटा दें। उचित स्थानों में didReceiveMemoryWarning और किसी भी अन्य दृश्य नियंत्रक प्रबंधन में स्मृति समस्याओं को संभालें।

संपादित

मैं पूछ सकते हैं: उन "उचित स्थानों" क्या हैं? मैं कुछ स्थितियों में ViewdidUnload का उपयोग करता था, जहां देखें [विल/किया गया] पूरी तरह से पर्याप्त नहीं था। नेविगेशन नियंत्रक ढेर पर आगे जाने की तरह। क्या आप उस पर आगे विस्तार करना चाहते हैं? - Dan1one

यह निर्भर करता है। मुझे पता है कि आप जो नहीं सुनना चाहते हैं, लेकिन यह सच है :-)

सामान्य रूप से, आपको असमानता से बचना चाहिए। इस प्रकार, आपको सममित विधि का उपयोग करके एक ऑपरेशन को "पूर्ववत" करना चाहिए जिससे आपने मूल "किया" था। आम तौर पर, आप सभी viewDidUnloaddidReceiveMemoryWarning और dealloc में कार्य करने में सक्षम होना चाहिए।

यह वास्तव में बदलाव नहीं करना चाहिए, क्योंकि आपको उन दोनों स्थानों में से किसी भी कोड को डुप्लिकेट करना था।

मुझे नहीं पता कि "नेविगेशन नियंत्रक स्टैक पर आगे बढ़ने" का मतलब क्या है, इसलिए आपको उपयोगी प्रतिक्रिया प्रदान करने के लिए मेरे लिए उस उदाहरण को स्पष्ट करने की आवश्यकता होगी।

viewDidDisappear उपयोग करने के साथ समस्या यह है और viewDidAppear है कि यह पता करने के लिए जब दृश्य दिखाई दे रहा था, क्योंकि यह वास्तव में प्रदर्शित होने गया था, या क्योंकि एक दृश्य है कि यह गायब हो गया था की चोटी पर था ... प्रकट करने के लिए इसका कारण मुश्किल था था ।

एपीआई के इन टुकड़ों आप उन मुद्दों का समाधान करने में मदद करने की अपेक्षा की जाती:

- (BOOL)isMovingFromParentViewController 
- (BOOL)isMovingToParentViewController 
- (BOOL)isBeingDismissed 
- (BOOL)isBeingPresented 
+0

क्या मैं पूछ सकता हूं: वे "अपरिवर्तनीय स्थान" क्या हैं? मैं कुछ स्थितियों में ViewdidUnload का उपयोग करता था, जहां देखें [विल/किया] गायब हो गया था पूरी तरह से पर्याप्त नहीं था। नेविगेशन नियंत्रक ढेर पर आगे जाने की तरह। क्या आप उस पर आगे विस्तार करना चाहते हैं? – Dan1one

+0

@ Dan1one: umm ... 'viewDidUnload' को स्टैक से पॉप अप होने पर या अन्य परिस्थितियों में नहीं कहा जाता है। तो मुझे नहीं पता कि आप क्या कर रहे थे – user102008

+0

महीनों के लिए मैंने देखा सबसे बड़ा जवाब। धन्यवाद! –

8

iOS 6 में, विचारों कभी नहीं उतार रहे हैं।

इसका मतलब है कि loadView और viewDidLoad केवल कभी एक बार बुलाए जाते हैं, और viewDidUnload कभी नहीं कहा जाता है। इसलिए यदि आपका व्यू कंट्रोलर कम स्मृति स्थितियों को संभालने के लिए viewDidUnload का उपयोग करता है तो उसे बदलने की आवश्यकता होगी।

यदि आप कम स्मृति स्थितियों का जवाब देना चाहते हैं, तो didReceiveMemoryWarning लागू करें और इस विधि में अपने अस्थायी डेटा और ऑब्जेक्ट्स को जारी करें।

6

iOS 6 में हम ourself द्वारा विचारों को रिहा करना चाहिए, इस

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 

    if([self isViewLoaded] && self.view.window == nil) 
    { 
     self.view = nil; 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^