Удаление представлений из UIScrollView - PullRequest
1 голос
/ 22 сентября 2010

Используя пример PhotoScroller от Apple, для повторного использования памяти, выделенной для представлений, я не могу освободить память после того, как число сохранений достигнет 0. Вот мой код для лучшего понимания: Эта часть является выдержкой из PhotoScroller
PhotoViewController.m

- (void)configurePage:(ImageScrollView *)page forIndex:(NSUInteger)index  
{  
    page.index = index;  
    page.frame = [self frameForPageAtIndex:index];  
    [page displayPage:index];  
}

ImageScrollView.h

@interface ImageScrollView : UIView  
{

    UIViewController *vc;
    NSUInteger     index;

}  
@property (assign) NSUInteger index;

- (void)displayPage:(int)indice;

@end

ImageScrollView.m

- (void)dealloc  
{    
 [vc release];  
    [super dealloc];  
}

- (void)displayPage:(int)indice  
{  

     //remove previous view  
     [vc.view removeFromSuperview];  
     [vc release];  
     vc = nil;  
     //NSLog(@"vc retain %i", [vc retainCount]);  

     // make a new viewController for the new page   
     Class clss = NSClassFromString([NSString stringWithFormat:@"page_0%i", indice + 1]);   
     vc = [[clss alloc] initWithNibName:[NSString stringWithFormat:@"page_0%i", indice + 1] bundle:nil];  

     [self addSubview:vc.view];  
}

Классы "page_0x" являются UIViewControllers. Пока нет ничего, кроме UIImageView на XIB. Пример страницы_01:
@implementation page_01

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Overriden to allow any orientation.
    return YES;
}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}


- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}


@end

Объем памяти достигает 148 МБ на устройстве. Дает мне предупреждение уровня памяти 1, затем освобождает память. Опускается до 95 МБ. Продолжает идти вверх и вниз.

1 Ответ

0 голосов
/ 22 сентября 2010

Возможно, ваши контроллеры представления page_0x освобождаются, но то, что они создали, - нет.Некоторые вещи для проверки:

  1. Установите точку останова в методе dealloc ваших контроллеров представления page_0x.Он вызывается?

  2. Проверьте все IBOutlets и другие переменные экземпляра ваших контроллеров представления page_0x.Все ли они правильно выпущены в методе dealloc своего класса?

  3. Запустить Build & Analyze.Получается ли что-нибудь?

  4. Попробуйте запустить инструмент Leaks.Он может сказать вам, какие объекты на самом деле протекают.

  5. (РЕДАКТИРОВАТЬ) Теперь хватается за соломинку.Вы не включили NSZombieEnabled, не так ли?

  6. (РЕДАКТИРОВАТЬ 2) Вы говорите, что бросаете .png на него.Что произойдет, если вы удалите этот файл .png?

  7. Если вы работаете в симуляторе, попробуйте его на устройстве.(См. этот вопрос .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...