He mirado en el proyecto "PageControl" muestra de Apple (See here) y veo esta función en el código:¿Código incorrecto en el código de ejemplo de Apple?
- (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];
}
}
Hay algo que no entiendo.
Si la pieza de prueba if ((NSNull *)controller == [NSNull null])
es cierto, entonces tenemos
controller = [[MyViewController alloc] initWithPageNumber:page];
[viewControllers replaceObjectAtIndex:page withObject:controller];
[controller release];
A continuación, sólo después de:
if (controller.view.superview == nil)
Pero, controlador acaba de ser puesto en libertad. Creo que puede funcionar porque el controlador todavía está en la memoria, pero ¿no es esta una forma incorrecta de codificar el material?
+1 a la idea de usar la liberación automática. Tal como están las cosas, el código no solo se basa en el hecho de que NSArray retiene los objetos agregados (bastante común, como usted dice), sino que tampoco depende de ningún otro hilo que elimine el objeto del NSArray. (Es cierto que, dado que estos son objetos de UI, es poco probable que suceda, pero sigue siendo un mal karma seguir usando un objeto que no conservas). –