Печать 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

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

One Solution collect form web for “Печать NSError от NSLog всегда вызывает EXE_BAD_ACCESS”

Первый аргумент 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)") 
  • handleOpenURL не будет запускать iOS Swift 2
  • Как преобразовать общий криптокод из Objective-C в Swift?
  • CALayerInvalidGeometry crash на подслое iOS9 с не конечным положением "
  • Как открыть конкретный пост при нажатии на push-уведомление
  • Как заставить коллекцию просматривать ответные жесты за пределами своего собственного вида
  • iOS - виджет расширения для домена со временем
  • Как обрезать видеофайл и конвертировать в 20 секунд видео с помощью Swift?
  • UIButton в Swift 2.2. Как добавить другую цель?
  • Поддерживает ли AlamofireObjectMapper / ObjectMapper отображение типа структуры
  • Использование If-Let и проверка вывода в одной строке
  • Многострочная этикетка в быстром 2 комплекте спрайтов?
  • Interesting Posts

    Автоматическая компоновка для tableHeaderView

    Открыть экран настроек клавиатуры в приложениях iOS по программному обеспечению из другого приложения

    NSURLErrorDomain Code = -1012 Операция не может быть завершена

    Сжатие Png файлов, отсутствующих в настройках сборки

    WCSession.sendMessage работает 50/50

    Не удается запустить приложение на реальном Apple Watch

    pod install вызывает ошибку «неизвестный тип файла» при создании Acknowledgements.plist

    Можно ли воспроизводить локальное видео с помощью UIWebView?

    как отключить алгоритм nagle в iOS?

    UISplitViewController – несколько подробных представлений с помощью UINavigationController

    iOS: Push Notifications перестали работать

    Почему для обновления пользовательского интерфейса от фонового потока требуется такое долгое время?

    Является ли активный контракт на оплату заявок, необходимый для тестирования в App Purchase?

    скрыть клавиатуру, перетащив палец, как приложение sms в iOS 5

    Как установить идентификатор доступности в UIAlertController?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.