Печать NSError от NSLog всегда вызывает EXE_BAD_ACCESS

У меня есть код для извлечения удаленного json-файла. Я попытался напечатать сообщение об ошибке, когда сеть недоступна (в режиме полета в целях создания ошибки).

Но каждый раз он поднимал EXE_BAD_ACCESS на линии регистрации

Мой код выглядит так:

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in if(error != nil){ let errorDesc = error!.description ?? "" NSLog("HTTP request error = \(error!.code), desc = \(errorDesc)") handler(houseList, error) return } ...Omitted for Brevity... } 

NSLog("HTTP request error = \(error!.code), desc = \(errorDesc)") – это строка, которая подняла ошибку

Мои наблюдения:

  • Прежде всего, в моем окне отладки error.description отлично выглядит. я вижу данные без проблем.

  • Во-вторых, если я изменяю NSLog для print() , тогда все работает просто отлично!

  • Наконец, если я изменил исходную строку на следующую, она тоже работает

    NSLog («Ошибка HTTP-запроса = (ошибка! .code), desc =% @", errorDesc)

Это связано с тем, что NSlog не может правильно обрабатывать String Interpolation ?

Если это так, то почему в некоторых случаях, таких как "HTTP request error = \(error!.code) , он может работать?

My Dev Environment: Xcode: версия 7.0.1 (7A1001) OS X: Yosemite 10.10.5 (14F27

Спасибо за ваше время!! 🙂

Первый аргумент NSLog() – это строка формата , аналогичная функции printf() из библиотеки C. Эта строка формата служит в качестве шаблона и содержит спецификаторы формата, такие как %d , %s , %@ , … Формат определяет, как интерпретируются остальные аргументы.

Теперь в вашем случае, в

 NSLog("HTTP request error = \(error!.code), desc = \(errorDesc)") 

код ошибки и описание интерполируются в строку формата. Если описания ошибок содержат спецификатор формата (например, %s ), то NSLog() ожидает другой аргумент (например, строка). Если аргумент отсутствует или у него неправильный тип, поведение не определено, и код может быть поврежден.

Поэтому строка формата всегда должна быть константным строковым литералом:

 NSLog("HTTP request error = %ld, desc = %@", error!.code, errorDesc) 

Если вы хотите воспользоваться интерполяцией строк Swift, используйте только %@ в качестве формата и передайте интерполированную String качестве дополнительного аргумента:

 NSLog("%@", "HTTP request error = \(error!.code), desc = \(errorDesc)") 
  • Безопасно ли обновление до Xcode 7.1 при написании проекта с использованием Xcode 7 и Swift 2
  • AVPlayer останавливается на фоне
  • являются ли плохие показатели производительности быстрыми?
  • Swift 2: NSData (contentsOfURL: url), возвращающий ноль
  • Неожиданно останавливается действие переупорядочивания ячейки UITableView
  • Нарушение изменения для получения имени файла без расширения в Swift2
  • Google push-уведомление не работает в производстве
  • Как перейти от UIAlertView (устаревший в iOS8)
  • Разрешить пользователям фоновую музыку в swift 2.0
  • Обработка исключений Swift 2.0
  • pathExtension недоступно: вместо этого используйте pathExtension для NSURL. Swift 2.0
  • Давайте будем гением компьютера.