#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?