2012-09-22 21 views
11

आईओएस 6, viewWillUnload और viewDidUnload बहिष्कृत किए गए हैं और UIViewControllers अब उन दृश्यों को अनलोड नहीं करते हैं जो स्मृति चेतावनी के दौरान स्क्रीन पर दिखाई नहीं दे रहे हैं। View Controller Programming Guide का एक उदाहरण है कि इस व्यवहार को मैन्युअल रूप से पुनर्स्थापित कैसे करें।मेमोरी चेतावनी (ऐप्पल डॉक्टर दोष) में आईओएस 6 में विचारों को उतारने का सही तरीका क्या है?

अगली बार दृश्य संपत्ति एक्सेस किया जाता है, दृश्य वास्तव में पुनः लोड कर रहा है के रूप में यह था:

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Add code to clean up any of your own resources that are no longer necessary. 
    if ([self.view window] == nil) 
    { 
     // Add code to preserve data stored in the views that might be 
     // needed later. 

     // Add code to clean up other strong references to the view in 
     // the view hierarchy. 
     self.view = nil; 
    } 
} 

कोड नमूना नीचे निम्न टिप्पणी है:

यहाँ कोड नमूना है पहली बार।

यहां एक स्पष्ट दोष है। यदि कोई दृश्य नियंत्रक जिसने अपना दृश्य लोड नहीं किया है, तो स्मृति चेतावनी प्राप्त होती है, यह if ([self.view window] == nil) लाइन में अपना दृश्य लोड करेगी और फिर इसे साफ़ करने और इसे फिर से रिलीज़ करने के लिए आगे बढ़ेगी। सबसे अच्छा, यह अक्षम है। सबसे खराब, यह जटिल दृश्य पदानुक्रम और सहायक डेटा लोड होने पर स्मृति की स्थिति को और खराब कर देता है। मैंने आईओएस सिम्युलेटर में इस व्यवहार की पुष्टि की।

मैं निश्चित रूप से इस पर कोड कर सकता हूं लेकिन ऐप्पल डॉक्स के लिए ऐसी त्रुटि होने के लिए अजीब लगता है। क्या मैं कुछ भूल रहा हूँ?

उत्तर

17

दृश्य के लिए एक दृश्य नियंत्रक में सही जांच लोड किए जा रहे है और स्क्रीन पर है:

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

iOS 6 में मेरे पूर्ण समाधान के लिए एक दृश्य नियंत्रक विचारों और सफाई करने के लिए आईओएस 5 समान उतारना है करने के लिए निम्नलिखित:

// will not be called in iOS 6, see iOS docs 
- (void)viewWillUnload 
{ 
    [super viewWillUnload]; 
    [self my_viewWillUnload]; 
} 

// will not be called in iOS 6, see iOS docs 
- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    [self my_viewDidUnload]; 
} 

// in iOS 6, view is no longer unloaded so do it manually 
- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    if ([self isViewLoaded] && [self.view window] == nil) { 
    [self my_viewWillUnload]; 
    self.view = nil; 
    [self my_viewDidUnload]; 
    } 
} 

- (void)my_viewWillUnload 
{ 
    // prepare to unload view 
} 

- (void)my_viewDidUnload 
{ 
    // the view is unloaded, clean up as normal 
} 
+0

पीछे की संगतता के लिए 'viewDidUnload' और' viewWillUnload' हैं? यदि ऐसा है, तो मैं यह कहने के लिए कोड पर टिप्पणी करने का सुझाव दूंगा कि इन दो विधियों को आईओएस 6 में बिल्कुल नहीं कहा जाएगा (जैसा कि [UIViewController दस्तावेज़] (http://developer.apple.com/library/ios/#documentation /uikit/reference/UIViewController_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/instm/UIViewController/viewWillUnload) स्थिति)। –

+0

अच्छा सुझाव, thx। किया हुआ। – XJones

+0

क्या यह कुछ हद तक बेहतर नहीं होगा यदि आप कस्टम ''my_view {Will | Did} Unload' के बजाय' (self viewWillUnload] 'और' [self viewDidUnload]' के अनुसार '- didReceiveMemoryWarning' को कॉल कर सकते हैं? – Ali