2011-03-18 14 views
5

मैं एप्पल "PageControl" नमूना परियोजना (See here) को देखा है और मैं कोड में इस कार्यप्रणाली देखें:ऐप्पल नमूना कोड पर बुरा कोड?

- (void)loadScrollViewWithPage:(int)page 
{ 
    if (page < 0) 
     return; 
    if (page >= kNumberOfPages) 
     return; 

    // replace the placeholder if necessary 
    MyViewController *controller = [viewControllers objectAtIndex:page]; 
    if ((NSNull *)controller == [NSNull null]) 
    { 
     controller = [[MyViewController alloc] initWithPageNumber:page]; 
     [viewControllers replaceObjectAtIndex:page withObject:controller]; 
     [controller release]; 
    } 

    // add the controller's view to the scroll view 
    if (controller.view.superview == nil) 
    { 
     CGRect frame = scrollView.frame; 
     frame.origin.x = frame.size.width * page; 
     frame.origin.y = 0; 
     controller.view.frame = frame; 
     [scrollView addSubview:controller.view]; 

     NSDictionary *numberItem = [self.contentList objectAtIndex:page]; 
     controller.numberImage.image = [UIImage imageNamed:[numberItem valueForKey:ImageKey]]; 
     controller.numberTitle.text = [numberItem valueForKey:NameKey]; 
    } 
} 

वहाँ कुछ मुझे समझ नहीं आता है।

if (controller.view.superview == nil) 

लेकिन, नियंत्रक बस जारी की गई है:
तो परीक्षण हिस्सा if ((NSNull *)controller == [NSNull null]) सच है, तो हम

controller = [[MyViewController alloc] initWithPageNumber:page]; 
[viewControllers replaceObjectAtIndex:page withObject:controller]; 
[controller release]; 

तो बस के बाद की है। मुझे लगता है कि यह काम कर सकता है क्योंकि नियंत्रक अभी भी स्मृति में है, लेकिन क्या यह सामान को कोड करने का गलत तरीका नहीं है?

उत्तर

2

जब controller ऑब्जेक्ट viewControllers में ऑब्जेक्ट को बनाए रखा गया तो ऑब्जेक्ट को बनाए रखा गया। इसलिए, इसे जारी करने के बाद भी यह एक जीवित वस्तु है।

क्या यह गलत है? शायद, यह NSArray के ज्ञान की आवश्यकता है, लेकिन यह काफी आम है।

मैं ऐसा किया होता तो:

if ((NSNull *)controller == [NSNull null]) 
{ 
    controller = [[[MyViewController alloc] initWithPageNumber:page] autorelease]; 
    [viewControllers replaceObjectAtIndex:page withObject:controller]; 
    controller = [viewControllers objectAtIndex:page]; 
} 
+0

+1 autorelease का उपयोग करने के विचार से +1। जैसा कि यह खड़ा है, कोड न केवल इस तथ्य पर भरोसा कर रहा है कि एनएसएआरएआरई इसमें शामिल वस्तुओं को बरकरार रखता है (जैसा कि आप कहते हैं), लेकिन एनएसएआरएआरई से ऑब्जेक्ट को हटाने के किसी भी अन्य धागे पर निर्भर करता है। (माना जाता है, चूंकि ये यूआई ऑब्जेक्ट्स हैं, ऐसा होने की संभावना नहीं है, लेकिन यह उस वस्तु का उपयोग जारी रखने के लिए अभी भी खराब कर्म है जिसे आप बनाए नहीं रखते हैं।) –

3

मुझे लगता है कि आप सही हैं। अगर मैं इसे कोड कर रहा था तो मैंने जोड़ा होगा:

if ((NSNull *)controller == [NSNull null]) 
{ 
    controller = [[MyViewController alloc] initWithPageNumber:page]; 
    [viewControllers replaceObjectAtIndex:page withObject:controller]; 
    [controller release]; 
    controller = [viewControllers objectAtIndex:page]; 
} 

रिलीज़ करने के बाद संदर्भ प्राप्त करने के लिए।

या मुझे लगता है कि दूसरी तरफ रिलीज के बजाय ऑटोरेलीज का उपयोग करना होगा।

+0

मैं downvote के लिए एक स्पष्टीकरण के लिए, कृपया मिल सकता है? –

+0

@fluchtpunkt: मुझे इस डाउनवोट के कारण को समझ में नहीं आ रहा है ... यह उत्तर मान्य है ... – Oliver

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