2012-12-06 18 views
5

मैं अपने आईओएस 6/आईओएस 6 ऐप में एनआईबी फाइलों के साथ कई स्टोरीबोर्ड मिश्रण कर रहा हूं।आईओएस में एकाधिक स्टोरीबोर्ड + मेमोरी मैनेजमेंट

स्मृति प्रबंधन एकाधिक स्टोरीबोर्ड के साथ कैसे काम करता है?

  • एक storyboardA शुरू करने पर, अगर मैं एक और निब फ़ाइल पर लौटने/एक और स्टोरीबोर्ड पर जाते हैं, करता है कि storyboardA सिर्फ स्मृति में वहाँ रहना?
  • क्या मैं स्टैकबोर्ड में स्टोरीबोर्ड का "ऐरे" प्राप्त कर सकता हूं जिस तरह से मैं UIViewControllers के साथ नेविगेशन नियंत्रक के ढेर में दृश्यों की सरणी प्राप्त करने में सक्षम हूं?
  • स्मृति प्रबंधन के लिए, क्या मैं स्मृति से स्टोरीबोर्ड पॉप या हटा सकता हूं? जब मैं किसी अन्य स्टोरीबोर्ड पर जाता हूं तो क्या मैं इसे शून्य पर सेट करता हूं?

कारण मैं निब फ़ाइलों के साथ मिश्रित कई स्टोरीबोर्ड उपयोग कर रहा हूँ:

  • मैं जटिल कथा स्टोरीबोर्ड प्रवाह चाहते हैं। उन्हें एक ही स्थान पर स्लैम करने का अर्थ नहीं है।
  • अंततः मैं कई अलग अलग लोगों के साथ काम करेंगे और मैं टीम के काम, संस्करण नियंत्रण के लिए विवश कर कई स्टोरीबोर्ड मार्ग
  • क्योंकि स्टोरीबोर्ड अभी तक जटिल निब साथ काम नहीं करते मैं निब फ़ाइलें मिश्रण कर रहा हूँ के लिए चुनते हैं के लिए बहस लगता है फाइलें, कई कार्यक्रम संबंधी विचारों, आदि

मेरे कोड स्निपेट्स

अंदर InitialNibFile.m < - कि AppDelegate से शुरू की है।

- (IBAction)newStoryboardBtnPressed:(id)sender { 

[self.view removeFromSuperview]; // here I remove this view from the superview to save memory 
UIStoryboard *newStoryboard = [UIStoryboard storyboardWithName:@"NewStoryboard" bundle:nil]; 
UIViewController *initialSettingsVC = [newStoryboard instantiateInitialViewController]; 

[self presentViewController:initialSettingsVC 
        animated:YES completion:nil]; 

} 
यहाँ एक UIViewController का मानना ​​है कि एक स्टोरीबोर्ड दृश्य के भीतर है अंदर

, ।

- (IBAction)anotherStoryboardBtnPressed:(id)sender { 

    // I'm inside a storyboard right now. I'm calling another storyboard. 
    // can i remove this storyboard before i launch the otherone? will keeping 2 or 3 toryboards in memory cause a memory leak? 

    UIStoryboard *settingsStoryboard = [UIStoryboard storyboardWithName:@"AnotherStoryboard" bundle:nil]; 
    UIViewController *initialSettingsVC = [settingsStoryboard instantiateInitialViewController]; 
    // i'm going to load this view controller modally 
    // initialSettingsVC.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal; 
    [self presentViewController:initialSettingsVC 
         animated:YES 
        completion:nil]; 

} 

उत्तर

7

तो यहाँ हम चले =)

एक storyboardA शुरू करने पर, अगर मैं एक और निब फ़ाइल पर लौटने/एक और स्टोरीबोर्ड पर जाते हैं, करता है कि storyboardA सिर्फ स्मृति में वहाँ रहना?
आपके द्वारा बनाए गए UIViewController द्वारा एक स्टोरीबोर्ड बनाए रखा जाता है (storyboard के माध्यम से) संपत्ति। तो हाँ, यह स्मृति में तब तक रहता है जब तक कि इसके सभी दृश्य नियंत्रकों को हटा दिया न जाए। (संक्षिप्त) documentation देखें।

क्या मैं स्टैण्डबोर्ड में स्टोरीबोर्ड का "ऐरे" प्राप्त करने में सक्षम हूं जिस तरह से मैं UIViewControllers के साथ नेविगेशन नियंत्रक के ढेर में दृश्यों की सरणी प्राप्त करने में सक्षम हूं?
नहीं, क्योंकि स्टोरीबोर्ड एक-दूसरे से स्वतंत्र हैं। हालांकि, आप अपने नौसेना के ढेर में दृश्य नियंत्रकों पर पुनरावृत्ति करके स्टोरीबोर्ड प्राप्त कर सकते हैं।

स्मृति प्रबंधन के लिए, क्या मैं स्मृति से स्टोरीबोर्ड पॉप या हटा सकता हूं? जब मैं किसी अन्य स्टोरीबोर्ड पर जाता हूं तो क्या मैं इसे शून्य पर सेट करता हूं?
यह तब तक रहेगा जब तक आपके पास स्मृति में तत्काल दृश्य नियंत्रक हो।जब आप storyboardWithName: का उपयोग करते हैं तो एक ऑटोरेलेज्ड ऑब्जेक्ट आपको वापस कर दिया जाता है। दृश्य नियंत्रक इसे बनाए रखेगा, इसलिए रिलीज़ करने या शून्य करने के बारे में चिंता न करें।

अपने अन्य प्रश्न के लिए संदर्भ के लिए, मैं करने के लिए इतना और इंटरनेट के बाकी स्थगित:
Best Practices for Storyboards on SO
UIStoryboard best practices
Multiple Storyboards in iOS on SO

मुबारक स्टोरीबोर्डिंग।

+0

धन्यवाद इतना MishieMoo! इससे बहुत मदद मिली। –

+0

अगर कोई आपके प्रश्नों का उत्तर देता है तो उत्तर स्वीकार करना सुनिश्चित करें =) – MishieMoo

+0

प्रतिभा जवाब ... अच्छी नौकरी ... –

4

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

+0

धन्यवाद जॉन! मैंने सलाह दी और मेरे नेविगेशन स्टैक सरणी में # व्यू कंट्रोलर की गिनती लॉग की। आप जो कह रहे हैं वह अब समझ में आता है! –

1

ऐसा लगता है आप स्मृति में अनावश्यक दृश्य नियंत्रक रखने से बचने के लिए कोशिश कर रहे हैं

यह एहसास है कि स्टोरीबोर्ड आवेदन के जीवन भर के लिए स्मृति में रखा जाता है एक बार यह instantiated है महत्वपूर्ण है। यदि वह वही नहीं है जो आप चाहते हैं, तो आप स्थिर स्थिर संपत्ति को स्थिर गणना वाली संपत्ति में बदल सकते हैं। अपने स्टोरीबोर्ड का विस्तार करें, वही बात जो आप अपने व्यू कंट्रोलर के लिए आवेदन कर सकते हैं ताकि आपकी एप्लिकेशन मेमोरी साफ हो।

import UIKit 

extension UIStoryboard { 

static var main: UIStoryboard { 
    return UIStoryboard(name: "Main", bundle: Bundle.main) 
} 

}