Возможно ли преобразовать NSUrl в NSString для пути к видеофайлу.
Да. Отправьте сообщение absoluteString
.
Я пытаюсь использовать NSString * path = [ExportoutputURL absoluteString]; но это сбой.
Если вы хотите указать путь, отправьте URL-адрес path
. Строка, представляющая URL, обычно не является допустимым путем; если вы хотите путь, попросите его.
Что касается сбоя, это не значит, что absoluteString
не так. Отправка absoluteString
объекту NSURL является правильным способом получения объекта NSString, который представляет URL-адрес. Проблема в другом.
Ошибка EXC_BAD_ACCESS в
NSString *path = [ExportoutputURL absoluteString];
Это, вероятно, означает, что ExportoutputURL
указывает на то, что не является nil
, но также не является допустимым объектом. В какой-то момент он мог указывать на объект NSURL, но сейчас это не так.
Думаю, проблема в следующем:
ExportoutputURL = session.outputURL;
Вы присваиваете URL переменной экземпляра ExportoutputURL
, но не сохраняете объект и не создаете свою собственную копию. Следовательно, вы не владеете этим объектом, что означает, что вы не поддерживаете его. Он может умереть в любое время, скорее всего, после того, как этот метод (exportDidFinish:
) вернется.
Сбой из-за того, что вы вызываете uploadVideoFile
позже, после того, как объект URL уже умер. У вас все еще есть указатель на него, но этот объект больше не существует, поэтому отправка ему сообщения - любое сообщение - вызывает сбой.
Существует три простых решения:
- Сохраните объект URL при назначении его переменной экземпляра.
- Создайте свою собственную копию объекта URL и назначьте ее переменной экземпляра.
- Объявите
ExportoutputURL
как свойство с ключевым словом strong
или ключевым словом copy
и назначьте объект свойству , а не переменной экземпляра. Это вызовет установщик свойства, который, если вы его синтезируете или правильно реализуете, сохранит или скопирует для вас URL.
В любом случае, вы будете владеть объектом, и это будет поддерживать его, пока вы не отпустите его. Соответственно, вам нужно будет выпустить его, когда вы закончите с ним (в dealloc
, если не раньше), чтобы вы не пропустили его.
Все это предполагает, что вы не используете ARC. Если вы используете Xcode 4.2 или более позднюю версию, и вам может потребоваться iOS 4 или более поздняя версия, вы должны перенести свой проект в ARC, поскольку это значительно упрощает многие вещи. Вам не нужно было бы сохранять или копировать этот объект, если вы использовали ARC, что означает, что переход на ARC теперь является четвертым решением (но, безусловно, более масштабным).