मैं एप्पल "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];
तो बस के बाद की है। मुझे लगता है कि यह काम कर सकता है क्योंकि नियंत्रक अभी भी स्मृति में है, लेकिन क्या यह सामान को कोड करने का गलत तरीका नहीं है?
+1 autorelease का उपयोग करने के विचार से +1। जैसा कि यह खड़ा है, कोड न केवल इस तथ्य पर भरोसा कर रहा है कि एनएसएआरएआरई इसमें शामिल वस्तुओं को बरकरार रखता है (जैसा कि आप कहते हैं), लेकिन एनएसएआरएआरई से ऑब्जेक्ट को हटाने के किसी भी अन्य धागे पर निर्भर करता है। (माना जाता है, चूंकि ये यूआई ऑब्जेक्ट्स हैं, ऐसा होने की संभावना नहीं है, लेकिन यह उस वस्तु का उपयोग जारी रखने के लिए अभी भी खराब कर्म है जिसे आप बनाए नहीं रखते हैं।) –