AVAudioPlayer возвращает nil случайным образом

#objective-c #iphone #xcode #ipad #avaudioplayer

#objective-c #iPhone #xcode #iPad #avaudioplayer

Вопрос:

В моем коде есть следующие строки:

 NSString *soundPath = [[NSBundle mainBundle] pathForResource:[[soundString componentsSeparatedByString:@"."]objectAtIndex:0] ofType:@"wav"];
NSURL *soundURL_ = [NSURL fileURLWithPath:soundPath];
av_player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL_ error:nil];
  

Эти строки находятся в вызовах класса AnimatableObject , которые я использую примерно от 10 до 30 раз за один ViewController .

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

 av_player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL_ error:nil];
  

Я проверил, являются ли soundPath или soundURL_ равными нулю. Но они в порядке. Точно такое же значение, как и все предыдущие, когда оно работало.

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

Я действительно понятия не имею, почему это происходит.

Любая помощь будет оценена. Заранее спасибо, индивидуалист.

———Редактировать———

Теперь я обнаружил, что получаю следующую ошибку:

 ImageIO: CGImageRead_mapData 'open' failed '/var/mobile/Applications/F3186E1A-BBC2-47A6-8EF6-90F73C9BD566/huckla_zoo.app/Weiter.png'
error = 24 (Too many open files)
  

итак, я понимаю, что не могу открыть звуковой файл, когда получаю эту ошибку.
Единственное, что мне интересно сейчас:
Как я могу закрыть дескрипторы файлов?
Я загружаю изображения не через [UIImage imageNamed:] , а с

 [UIImage imageWithContentsOfFile:filename];
  

Я также внедрил MutableDictionary в качестве кэша изображений, который очищается при возникновении проблем с памятью.
Есть ли какой-либо другой вариант для меня, чтобы закрыть мои дескрипторы файлов?

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

1. из документации initWithContentsOfURL:ошибка: возвращаемое значение метода: «Если nil, параметр ошибки содержит код, описывающий проблему». вместо того, чтобы передавать nil, передайте объект NSError и посмотрите, какую ошибку вы получите, я бы еще раз проверил soundPath и soundURL_, если они не равны нулю

2. хорошо, я обновил вопрос, поскольку теперь я знаю, что вызывает сбой. спасибо alhcr.

Ответ №1:

ПОПРОБУЙТЕ ЭТО,

NSString* URL = [YOUR_URL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

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

1. Вы действительно потрясающие, в имени моего приложения были пробелы, и это решило мою проблему. 1 После трех лет! Также эта проблема для iOS 7 …

Ответ №2:

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

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

1. да, у меня действительно открыто много файлов. Где лучше всего их выпустить? при освобождении AnimatableObject, который содержит файл? У меня есть от 10 до 30 объектов типа AnimatableObject на ViewController. Каждый AnimatableObject может содержать on UIImage и один или несколько AVAudioPlayers. AnimatableObjects являются IBOutlets, поэтому я установил для них значение nil в viewDidUnload ViewController. Должен ли я освобождать все переменные, содержащиеся в AnimatableObject, в методе dealloc?