Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to release a viewController and his view inside of an NSMutableArray viewControllers?
    primarykey
    data
    text
    <p>I have a big problem with my memory management. A actually have a big magazine and every page it is render with his own PageViewController. My code it's totally based on PageControl sample of Apple Documentation, if you guys have seen sometime.</p> <p>So, in the viewDidLoad of my "MainViewController" I create a NSMutableArray = self.viewControllers full of NSNull objects. And I call my <code>[self loadScrollViewPage:page];</code> for my first and second pages. When the user navigate into more pages, I call (from scrollViewDidScroll) more load <code>[self loadScrollViewPage:nextPage];</code> as the App will be need it. Also I implement a <code>unloadScrollViewPage:page</code> 'cause the magazine is so big, that the memory will be out if I don't.</p> <p>So, this is my code:</p> <pre><code>- (void)loadScrollViewPage:(int)pageNumber { if ((pageNumber &lt; 0) || (pageNumber &gt;= [self.viewControllers count])) return; PageViewController *controller = [self.viewControllers objectAtIndex:pageNumber]; if ((NSNull *)controller == [NSNull null]) { controller = [[PageViewController alloc] initWithPage:[self.pages objectAtIndex:pageNumber]]; [self.viewControllers replaceObjectAtIndex:pageNumber withObject:controller]; [controller release]; } if (controller.view.superview == nil) { CGRect frame = mainpageScrollView.frame; frame.origin.x = 0; frame.origin.y = frame.size.height * pageNumber; controller.view.frame = frame; [mainpageScrollView addSubview:controller.view]; } } - (void)unloadScrollViewPage:(int)pageNumber { if ((pageNumber &lt; 0) || (pageNumber &gt;= [self.viewControllers count])) return; if ((NSNull *)[self.viewControllers objectAtIndex:pageNumber] != [NSNull null]) { [[[self.viewControllers objectAtIndex:pageNumber] view] removeFromSuperview]; [self.viewControllers removeObjectAtIndex:pageNumber]; [self.viewControllers replaceObjectAtIndex:pageNumber withObject:[NSNull null]]; } } </code></pre> <p>The problem is, no matter how many times I call <code>unloadScrollViewPage</code>, the memory still increment size when I call <code>loadScrollViewPage</code> and never decrement with <code>unloadScrollViewPage</code>. So, when the user is going in the 10 page (of 300 pages, lol?) the memory size of my App is of 100Mb and of course, it crash :(</p> <p>My questions are:</p> <ul> <li>Am I releasing memory correctly from my self.viewControllers NSMutableArray?</li> <li>The views of each controller that I put on they superview (the view of MainViewController) will release it when I removeObjectAtIndex:pageNumber from the self.viewControllers? If not, how can I do it? Is this my problem?</li> </ul> <p>Thanks in advanced.</p> <p><strong>EDIT:</strong></p> <p>Looks like <strong>Firoze Lafeer</strong> was right at the beginning, the problem was my UIImage memory management and my views retained. I just manage to removeFromSuperview each UIView. For the images, looks like using <code>[UIImage imageNamed]</code> it implements a cache (that release it when ios wants ¬¬). I just change the way using <code>[UIImage imageWithData:imageData];</code> which doesn't implements cache and all my objects are happy now. Thanks everybody. :)</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload