Уровень сбоя Xcode = 1 + 2 без потенциальных утечек (возможно из-за анимации) - PullRequest
0 голосов
/ 03 сентября 2011

Прежде всего, я n00b.После долгих попыток и исследований я решил получить внешнюю помощь.Мой проект: я сделал книгу для детей.После того, как я проанализировал код, я избавился от всех потенциальных утечек, но все равно у меня произошел сбой уровня = 1 + 2.с тестированием моего приложения я понял, что моя анимация может быть проблемой, потому что после пролистывания книги и просмотра около 30 анимаций она вылетает.
Я забыл что-то выпустить?может быть, вы видите то, чего я не вижу.Вот мой код

- (void)addButton1 {
    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button1 setFrame:CGRectMake(174, 100, 421, 250)];
    [button1 setBackgroundImage:[UIImage imageNamed:@"button.png"] 
                   forState:UIControlStateNormal];
    [button1 addTarget:self action:@selector(buttonPressed1)
      forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button1];
}

- (void)animieren1:(UIImageView *)image {
    [self animationZustand1];
    [UIView commitAnimations];  
}

- (void)buttonPressed1 {
    [self animieren1:self.animation1];
}


- (void)normalZustand2 {
    [self.animation2 setImage:[UIImage imageNamed:@"muller3s.png"]];
}

- (void)initAnimation2 {
    animation2 = [[UIImageView alloc] initWithFrame:
                   CGRectMake(173, 550, 422, 262)];
    [self normalZustand2];
    self.animation2.opaque = YES;
    [self.view addSubview:self.animation2];
}   

- (void)animationZustand2 {
    NSArray *imageArray = [[NSArray alloc] initWithObjects:
                       [UIImage imageNamed:@"muller3s.png"],
                       [UIImage imageNamed:@"muller4s.png"],
                       nil];    
    self.animation2.animationImages = imageArray;
    self.animation2.animationDuration = 2.1;
    animation2.animationRepeatCount = 1;
    [self.animation2 startAnimating];
    [self normalZustand2];
     [imageArray release];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"riesel" ofType:@"mp3"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL   
    fileURLWithPath:path] error:NULL];
    theAudio.volume = 0.1;
    self.audioPlayer3 = theAudio;
    [theAudio play];
    [theAudio release];
}       

Есть идеи?Было бы здорово, если бы кто-нибудь мог мне помочь!Заранее спасибо Planky

1 Ответ

1 голос
/ 03 сентября 2011

Похоже, вам неясно, что такое сбой на уровне 1.Уровни относятся к предупреждениям памяти - ваше приложение получает уведомления от системы, когда вы близки к исчерпанию памяти вашего приложения.

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

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

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

В графически богатых приложениях также важно помнить, что размер файла не равен размер изображения занимает в памяти.Предположим, у вас есть файл PNG размером с экран iPad (1024x768).При загрузке в память это изображение занимает более 3 мегабайт памяти.Все устройства iOS ограничены в памяти, некоторые в большей степени, чем другие: на iPad первого поколения это отдельное изображение могло бы занимать 5% от общего объема выделенной памяти (точный объем, к которому у вашего приложения есть доступ, варьируется и зависит от многих факторов: отсюда, почему выполучать уведомления, когда вы приближаетесь к пределу).

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

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