2011-06-10 7 views
8

कई लोग एक व्यू कंट्रोलर के viewDidUnload विधि के दौरान कहते हैं कि आपको removeFromSuperview विधि को कॉल करके सबव्यूव को हटाना होगा।एक दृश्य नियंत्रक के भीतर, viewDidUnload के दौरान subviews पर removeFromSuperview को कॉल करना आवश्यक है?

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    ... snipped ... 
    [_tableBannerView removeFromSuperview]; 
    TT_RELEASE_SAFELY(_tableBannerView); 
    [_tableOverlayView removeFromSuperview]; 
    TT_RELEASE_SAFELY(_tableOverlayView); 
    ... snipped ... 
} 

मैं इस विश्वास के पीछे तर्क समझ में: उदाहरण के लिए, three20 कुछ इस तरह करता है अगर आप loadView में [self.view addSubview:_aView] कहते हैं, आप viewDidUnload में [_aView removeFromSuperview] फोन करना चाहिए। बात यह है कि यह आवश्यक प्रतीत नहीं होता है। जब एक व्यू कंट्रोलर का दृश्य जारी हो जाता है, तो इसकी डेलोक विधि स्वचालित रूप से इसके सभी सबव्यूज़ जारी करती है।

@interface TestView : UIView 
@end 

@implementation TestView 
- (id)retain { 
    NSLog(@"view retain"); 
    return [super retain]; 
} 
- (void)release { 
    NSLog(@"view release"); 
    [super release]; 
} 
- (id)init { 
    NSLog(@"view init"); 
    return (self = [super init]); 
} 
- (void)dealloc { 
    NSLog(@"view dealloc"); 
    [super dealloc]; 
} 
@end 

@interface TestViewController : UINavigationController 
@end 

@implementation TestViewController 
- (void)loadView { 
    NSLog(@"viewController loadView"); 
    [super loadView]; 
    [self.view addSubview:[[TestView new] autorelease]]; 
} 
- (void)viewDidUnload { 
    NSLog(@"viewController viewDidUnload"); 
    [super viewDidUnload]; 
} 
- (void)viewDidAppear:(BOOL)animated { 
    NSLog(@"viewDidAppear"); 
    [super viewDidAppear:animated]; 
    [self dismissModalViewControllerAnimated:YES]; 
} 
- (void)dealloc { 
    NSLog(@"viewController dealloc"); 
    [super dealloc]; 
} 
@end 

ऊपर कोड निम्नलिखित उत्पादन का उत्पादन:: मेरे परीक्षण कोड जब उनके superview जारी किया जाता है subviews स्वचालित रूप से रिलीज़ हो दिखाई देता है जब दृश्य नियंत्रक के मुख्य दृश्य जारी किया जाता है,

viewController loadView 
view init 
view retain 
view release 
viewDidAppear 
viewController dealloc 
view release 
view dealloc 

आप देख सकते हैं, इसके सबव्यूज़ भी जारी किए जाते हैं।

इसके अलावा, आईओएस डेवलपर लाइब्रेरी [राज्यों] (http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html#//apple_ref/doc/uid/TP40007457-CH101 -SW4 ): "कम-स्मृति स्थिति के मामले में, डिफ़ॉल्ट UIViewController व्यवहार दृश्य संपत्ति में संग्रहीत दृश्य ऑब्जेक्ट को रिलीज़ करना है यदि उस दृश्य का वर्तमान में उपयोग नहीं किया जा रहा है।" इसके अलावा: "यदि आप अपने दृश्य के संदर्भ को संग्रहीत करने के लिए घोषित संपत्ति का उपयोग करते हैं, और वह प्रॉपर्टी उपयोग सेमेन्टिक्स को बनाए रखती है, तो इसे शून्य मान निर्दिष्ट करने के लिए पर्याप्त है।"

इसलिए, यदि कोई दृश्य जारी करना स्वचालित रूप से अपना सबव्यू जारी करता है, तो removeFromSuperview को viewDidUnload के दौरान कॉल करना वास्तव में आवश्यक है?

उत्तर

3

नहीं, यह आवश्यक नहीं है, जैसा कि आपने काफी सही कहा है, dealloc, यह आपके लिए ऐसा करेगा :) (लंबी पोस्ट, संक्षिप्त उत्तर)।

1

मुझे यह मेरी परियोजना में आवश्यक पाया गया। मेरा व्यू कंट्रोलर का मुख्य दृश्य है (जैसा कि वे सभी करते हैं) और इस मामले में इसे xib का उपयोग करके परिभाषित किया गया है (प्रोग्रामेटिक रूप से आवंटित नहीं किया गया है और सबव्यूव के रूप में जोड़ा गया है)। इस दृश्य में व्यू कंट्रोलर में आईबीओटलेट्स के साथ सबव्यूव्यूज़ हैं। यदि, viewDidUnload पर, मैंने बस आईबीओलेट गुणों को शून्य (self.mySubView = nil) पर सेट किया है, तो उस सबव्यूव पर डेलोक को कॉल नहीं किया जाता है। अगर मैं इसे पहले इसके पर्यवेक्षण (मुख्य दृश्य) से हटा देता हूं, तो डेलोक को बुलाया जाता है।

+1

क्या आपके पास इसका वर्णन करने के लिए कोई उदाहरण कोड है? चूंकि आपने XIB का उल्लेख किया है, इसलिए जिथूब पर प्रोजेक्ट डालने से और भी मददगार होगा। धन्यवाद। –

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