Почему этот ImageView не выпускается?

#ios #ipad #memory #uiview

#iOS #iPad #память #uiview

Вопрос:

у меня есть заставка, которая отображается при запуске приложения, и мой клиент хочет, чтобы я оставлял ее видимой в течение x времени. Все работает отлично, за исключением того, что изображение никогда не выпускается?

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    NSString *fileLocation = [[NSBundle mainBundle] pathForResource:@"splash_page" ofType:@"png"];

    NSData *imageData = [[NSData alloc] initWithContentsOfFile:fileLocation];
    UIImage *launchImage = [[UIImage alloc] initWithData:imageData];
    [imageData release], imageData = nil;

    UIImageView *launchImageView = [[UIImageView alloc] initWithImage:launchImage];
    launchImageView.frame = CGRectMake(0, 
        0, 
        [[UIScreen mainScreen] bounds].size.width , 
        [[UIScreen mainScreen] bounds].size.height);
    launchImageView.tag = 121;
    [launchImage release], launchImage = nil;

    [self.window addSubview:launchImageView];
    [launchImageView release], launchImage = nil;   

    [self.window makeKeyAndVisible];    
    [self performSelector:@selector(initApp) withObject:nil afterDelay:kInitDelay];

    return YES;
}

- (void)initApp
{
    [[UIApplication sharedApplication] setStatusBarHidden:NO];

    UIImageView *launchImageView = (UIImageView*)[self.window viewWithTag:121];
    [launchImageView removeFromSuperview];

    RootNavController *navController = [[RootNavController alloc] initRootController];
    self.rootNavController = navController;
    [self.window addSubview:navController.view];
    [navController release], navController = nil;
}
  

Насколько я понимаю, removeFromSuperview вызывает release в представлении, поэтому это должно быть выпущено, однако я все еще вижу Malloc размером 524 кб в инструменте выделения объектов Intruments, который, я уверен, является изображением. Ответственная библиотека = libRIP.A.dylib и ответственный вызывающий ripl_Create.

Если я закомментирую код заставки и запущу NavController напрямую, у меня не будет этих 524 КБ.

Есть идеи?

Комментарии:

1. Если вы закомментируете только [self.window addSubview:launchImageView] строку, останется ли в ней 524 КБ? Вы проверили, [self.window viewWithTag:121] действительно ли по какой-то причине возвращается вид изображения, а не nil?

2. Если вы делаете «Предупреждение о симуляции памяти» из аппаратного меню симулятора, уходит ли память? Я думаю, что UIKit может кэшировать его для дальнейшего использования, пока не понадобится память

3. @Anomie Если я закомментирую эту строку, у меня все равно останется 524 кб, потому что, хотя я и не добавляю ее в окно, я все еще инициализирую ее. Если я закомментирую весь раздел, начиная с установки строки, то 524 кб больше не отображаются в obv. Также я распечатываю адрес для launchImageView сразу после его инициализации и после повторного получения с помощью viewWithTag и указания на тот же адрес?

4. @Cory я также подумал, что это может быть кэширование, поэтому в итоге я использовал метод обхода настроек изображения вместо использования imageNamed. Однако даже после того, как я имитирую предупреждение о памяти, оно не выпускается?

5. @HenryH: Как насчет того, чтобы полностью удалить выделение launchImageView (вместо этого просто инициализируйте переменную равным nil, а также пропустите addSubview , если необходимо)? Или то же самое для launchImage ?

Ответ №1:

Почему вы не используете файл Default.png в качестве заставки? Переименование вашего «Splash_page.png» в «Default.png» автоматически отобразит заставку при загрузке, а затем просто добавьте UIImageView (с Default.png) в главное окно и через x раз запустите ваш RootViewController.