Почему мой UIViewController не выпускается должным образом? - PullRequest
0 голосов
/ 15 августа 2011

Так что у меня проблемы с выпуском некоторых контроллеров представления. По сути, кажется, что dealloc для PhotoPostViewController никогда не вызывается, поэтому я не могу очистить содержащиеся в нем изображения, которые копают всю память.

Это мой подкласс UIViewController, я могу добавить до 100 из них одновременно в качестве подпредставлений к основному виду прокрутки, после этого iPad становится нехваткой памяти.

@interface PhotoPostViewController : UIViewController {
    IBOutlet UIImageView *backgroundImage;
    IBOutlet UIImageView *serviceImage;
}

Затем в моем классе основного представления у меня есть метод для создания этих представлений и добавления их в scrollView. Этот метод обычно вызывается из цикла для создания всех необходимых мне подпредставлений.

- (void) addPost {
    PhotoPostViewController *postView = [[PhotoPostViewController alloc] initWithNibName:@"PhotoPostViewController" bundle:nil];
    [scrollView addSubview:[postView view]];
    [viewControllers addObject:postView];
} 

viewControllers - это NSMutableArray, созданный в главном классе init. scrollView - это UIScrollView на моем главном экране.

Все это прекрасно работает, я знаю ограничение использования памяти на iPad и придерживаюсь его в любое время, открывая Popovers для предварительного просмотра изображений, видео и т. Д. Не хватает памяти, пока я не попытаюсь обновить экран. Код для этого:

- (IBAction)didPressRefresh:(id)sender {
    for(UIView *subview in [scrollView subviews]) {
        [subview removeFromSuperview];
    }
    for(UIViewController *c in viewControllers) {
        [c release];
    }
    [viewControllers removeAllObjects];
}

Ради простоты я очищаю все подпредставления и пытаюсь освободить их перед воссозданием следующего набора подпредставлений, используя функцию выше. Он удаляет их из представления, но не хватает памяти, добавляя новый набор контроллеров представления. В моих тестовых примерах наборы контроллеров представления идентичны по содержанию, поэтому, если он загружается из чистого первого раза, то он должен загружаться во второй раз и каждый раз после этого, если я все освобождаю должным образом.

На самом деле происходит сбой из-за нехватки памяти при создании второго набора контроллеров представления.

Во время отладки я установил контрольные точки для методов 'viewDidUnload' и 'dealloc', но они никогда не были достигнуты.

Похоже, что сам UIViewController выпускается, а UIImageViews внутри него нет, очевидно, они обычно освобождаются моим кодом в методе dealloc (или viewDidUnload).

Так что я в замешательстве. Считать вещи, которые мне кажутся похожими, счётчики ссылок в порядке. так почему же до сделки не дошло?

Andi

1 Ответ

2 голосов
/ 15 августа 2011

Вам необходимо отправить объект postView сообщение -release после добавления его в коллекцию viewControllers:

- (void) addPost {
   PhotoPostViewController *postView = [[PhotoPostViewController alloc] initWithNibName:@"PhotoPostViewController" bundle:nil];
   [scrollView addSubview:[postView view]];
   [viewControllers addObject:postView];
   [postView release];
} 

Причина, по которой вам нужно это сделать, заключается в том, что коллекция отправляет-retain сообщение всем объектам, которые добавляются к нему, следовательно, утечка памяти и -dealloc не ударились.

РЕДАКТИРОВАТЬ:

Ваш -didPressRefresh: методдолжен выглядеть так:

- (IBAction)didPressRefresh:(id)sender {
    [[scrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];     
    [viewControllers removeAllObjects];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...