Сообщение об ошибке «_BSMachError: (os / kern) недопустимая возможность (20)»


173

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

Редактировать 10 ноября 2015 г. Кроме того, обратите внимание, я пометил свой собственный ответ как ответ, но это было до того, как кто-то еще опубликовал. Я думаю, что ни один из них не должен быть помечен как ответ, потому что, как мы видели ниже ... у этой ошибки нет только одного ответа, потому что это очень низкий уровень.

я бегу

  • iOS 9.0 Симулятор
  • XCode 7.0

Вчера все работало нормально.

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

_BSMachError: (os / kern) недопустимая возможность (20)

_BSMachError: (os / kern) неверное имя (15)

Скриншот для этой проблемы - Я очистил свою папку сборки, - Я очистил папку производных данных, - Я сбросил симулятор.

Я работал с

  • UIViewController viewWillLayoutSubviews
  • UIViewController viewWillTransitionToSize:...

Я также проверял различные настройки «Рисования» в Инспекторе Атрибутов в IB.

Я также создал категорию утилит в UIView, где я создал несколько методов, которые создают CGRectи помогают мне назначать фреймы представлениям.

Root View Controller

Настройки контроллера Root View


я получаю эту ошибку при работе над BLE
Nex Mishra

1
Я пока не могу найти решение, и я тоже получаю его во время вращения. Вскоре после этого я иногда получаю предупреждение о памяти, хотя XCode сообщает, что используется только небольшой объем памяти. Разочарование.
Нарко

79
Хорошо, что вы отредактировали MyFoodTracker: P
Сэм Соффс

8
Почему MyFoodTracker перечеркнут красной линией на скриншоте?
Мариан Черны

2
@LogicsaurusRex "Что это значит?" это действительно не полезный вопрос, но "Нужно ли исправлять?" Возможно, это лучший вопрос (на который я хотел бы получить ответ). Мое приложение работает нормально, но показывает эту ошибку. Я хотел бы закрепить это и исправить, но это не маленькое приложение, и обнаружение, что это стоило бы мне драгоценного времени
vrwim

Ответы:


144

На основании https://forums.developer.apple.com/thread/15683 :

Поменяйте « Локализация региона собственного развития » info.plistна США вместо en.

Обновлено: тогда вы можете отменить эти изменения обратно.


3
У меня это тоже сработало. Затем я вернул настройку на «en», и ошибка, похоже, не возвращалась.
Скуа

Это сработало для меня, как НОВЫЙ случай возникновения этой ошибки. Я разместил оригинальное сообщение здесь и получал эту ошибку из-за одного из флажков рисования. Это ушло в течение долгого времени, и теперь начало появляться снова по некоторой другой неизвестной причине, и изменение этого фактически исправило это ... СВЯТАЯ КОРОВА, это потрясающе.
Логиксавр Рекс

Мое установлено ja, а не en. Что я должен делать? Установить это Japan?
Николас Миари

1
Это сработало. Однако снова вернулся к en и без ошибок 😒
Neo Ighodaro

30
Мне не очень нравятся такие ответы. Потому что это ничего не объясняет. Это ошибка в XCode? Это наш код позиционирования неправильно? Или что?
GeneCode

66

Я также столкнулся с _BSMachErrorошибками консоли, когда глубоко связывался с приложением «Настройки» на iOS 9 из UIAlertControllerдействия. А dispatch_asyncрешил мою проблему:

[aAlertVC addAction:[UIAlertAction actionWithTitle:@"Settings" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
    dispatch_async(dispatch_get_main_queue(), ^{
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
    });
}]];

2
Это убрало для меня ошибку консоли, но основная ошибка блокировки, которую я пытался исправить, возникающая в то же время, не помогла
Джейсон

Возможно, можно обобщить этот ответ, который я получил при выполнении segue в контроллере uialert (почти тот же код). Вероятно, это связано с тем, как alertcontroller выходит из картинки. Решил и мою проблему с dispatch_async.
user3802077

та же проблема здесь - в частности, это происходит в симуляторе 9.2 при переходе к настройкам системы из моего приложения через обработчик для UIAlertAction из UIAlertController. Когда я переписывал код в UIAlertController вместо старого UIAlertView, сим выдавал те же ошибки _BSMach (15,20). Не происходило на реальном устройстве (ipad). Dispatch_async сделал симулятор счастливым. Определенно связан с UIAlertController.
Майк Коган,

та же проблема возникла снова, на этот раз не в симе, а на ipad, а не в симе. на этот раз это был какой-то код, который отображал представление в pdf-контексте, что вызывало макрозеркала. снова dispatch_async исправил это. Я также проверил, что, когда этот код выполняется без вызова из обработчика завершения UIAlertAction в UIAlertController, эта ошибка не возникает. в обоих моих случаях ошибка была видна только в консоли отладки XCode, и приложение продолжало работать правильно. Ни одна из идей локализации, предложенных в этой теме, никак не повлияла ни на один из сценариев.
Майк Коган

@ Джейсон У меня была та же проблема, она удалила сообщение об ошибке консоли, но все равно вылетает. Вам удалось как-то решить это?
bp14

32

Хорошо, я не закрепил это полностью, но это даст вам 99% пути. Я использую сторонний элемент управления картой из ESRI, и что-то в этом не нравится одному из этих параметров рисования в Инспекторе Атрибутов. Я не пробовал каждый параметр по отдельности, чтобы увидеть, какой он установлен, но когда я выключил их все (в красном поле), все заработало как чудо, и я перестал получать сообщение об ошибке выше в консоли. Если и когда у меня будет время прибить его к точной настройке или комбинации настроек, я обновлю ответ.

введите описание изображения здесь


Я думаю, что ваш ответ довольно хорош. Однако я бы удалил жирный текст сверху. В последнее время было много анонимных ответов, я сомневаюсь, что это что-то личное.
Джейсон Д

Что делать, если я должен использовать один из них?
Зараки

15

Это безумие, но для меня решение было просто удалить все точки останова в файле, где произошла ошибка.

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

О мой дорогой XCode ...


Это сработало для меня. Один из признаков того, что это была проблема, заключался в том, что Xcode будет разрываться на линиях, которые не имеют точки останова. Затем, в другой строке, я получил _BSMachErrors выше.
дидже

12

Я получал те же ошибки ...

_BSMachError: (os/kern) invalid capability (20)
_BSMachError: (os/kern) invalid name (15)

Я звонил openURL () из UIAlertAction

alert.addAction(UIAlertAction(title: actionTitle, style: .Default) {
    UIApplication.shared.openURL(url)
 }

Отсрочка выполнения блока до следующего цикла выполнения исправила его ...

alert.addAction(UIAlertAction(title: actionTitle, style: .Default) {
    OperationQueue.main.addOperation {UIApplication.shared.openURL(url)}
 }

9

При получении новых данных я получал следующее:

> _BSMachError: (os/kern) invalid capability (20)
> _BSMachError: (os/kern) invalid name (15)

Ошибка произошла, когда кнопка использовалась для ввода новых данных. An NSTimerиспользовался для обновления и обновления данных после возвращения из performSegueWithIdentifierдействия. Таймер был активирован и затем недействителен сразу после использования во время возврата. MSMachErrorПрекращается , когда таймер был удален и - (void)viewWillAppear:(BOOL)animatedи (void)viewDidAppear:(BOOL)animatedбыли использованы для выполнения той же функции. Эта ошибка началась с обновления до Xcode 7.


6

Я исправил эту проблему, изменив значение Localization native development regionключа на United Kingdom [или любой конкретный регион] со значения по умолчанию, enприсутствующего в info.plistвашем проекте.

  1. Выбрать Project Navigator
  2. Найдите info.plistфайл в папке ProjectNameTests.
  3. Измените значение Localization native development region keyна любой конкретный регион, например. объединенное Королевство

Шаг 1 и 2

Шаг 3


Да, это исправление звучит безумно, но работает. Для меня приложение работало, когда Xcode 7.3.1 развернулся на привязанном iPod touch 5-го поколения. Но при первом развертывании из Xcode на привязанный iPad Air я столкнулся с этим BSMachError. Переключение региона на United Statesустранение ошибки. Еще одна необъяснимая загадка Xcode.
Василий Бурк

4

Я также столкнулся с той же проблемой в NSOperation, работающем в фоновом потоке, и я все еще получал эту ошибку, потому что UIAlertController все еще удалял себя, поскольку другая транзакция UI пыталась иметь место. Модификация моего кода для решения этой проблемы.

defer { 
    dispatch_async( dispatch_get_main_queue(),{
        completion()
    }) 
}

Многие люди не знают об отсрочке. Она позволяет завершить текущую область, а затем запускается после. Вроде аккуратно.


4

Я столкнулся с той же ошибкой: недопустимая возможность (20) и неверное имя (15). Я пробовал решения, упомянутые другими, такие как:

  • Локализация родного региона развития ключ в info.plist
  • Изменение настроек чертежа в инспекторе атрибутов
  • Даже измененный словарь исключений ATS в info.plist

Но ни одно из этих решений не решило мою проблему. На самом деле, я пытался поделиться каким-то документом, но создание документа заняло бы некоторое время, и я хотел отобразить UIActivityIndicatorView для пользователя до момента загрузки документа.

Решение для моей ошибки было:

//Create a alertView add UIActivityIndicatorView to it and present it in ViewController

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
//Call method 1 todo background process like getting data

dispatch_sync(dispatch_get_main_queue(), ^{
    //Call method 2 to update the UI
    [alert dismissViewControllerAnimated:YES completion:^(void){
        //My mistake was: I was calling method 2 over here to update the UI
        return;
    }];
});
});

Отлично, у меня сработало! Важно знать, что обновление пользовательского интерфейса должно выполняться в dispatch_get_main_queue ()
MkaysWork

3

Изменение строки локализации с en на Соединенные Штаты исправило это для меня. Тем не менее, убедитесь, что вы очистите после изменения Info.plist. Я заметил, что обновления не работают, когда вы просто строите после внесения изменений в plist.введите описание изображения здесь



2

Я мог бы воспроизвести ошибку для меня: если внесение изменений в одно из представлений в представлении, которое я фактически уже закрываю (popViewControllerAnimated), я получаю сообщение об ошибке.

У меня есть действие UINavigationButton, которое выполняет асинхронную задачу (POSTRequest). Перед выполнением этого запроса я установил для customView этой кнопки индикатор прогресса. При возвращении из асинхронного вызова я отправляю в основной поток и сбрасываю customView этой кнопки. После этого я закрываю представление (popViewControllerAnimated).

Это ПРАВИЛЬНЫЙ код, где ошибка не появляется:

/* right way, working without BSMachError */
@IBAction func sendRequest(sender: UIBarButtonItem) {
    /* setting the progress indicator as customView of the self.saveButton */
    self.showActivityIndicatory(self.saveButton)
    /* asynchronous REST call */
    UserDataManager.sharedInstance.requestFeedback(request, onCompletion: { error in
        dispatch_async(dispatch_get_main_queue(),{
        /* resetting the saveButton again to default by setting customView to nil */
        self.saveButton.customView = nil
        /* closing the view */
        self.navigationController!.popViewControllerAnimated(true)
      })
    })
}

Причиной ошибки было переключение строк: закрытие представления, а затем установка customView равным nil:

/* WRONG way, causing BSMachError */
@IBAction func sendRequest(sender: UIBarButtonItem) {
    /* setting the progress indicator as customView of the self.saveButton */
    self.showActivityIndicatory(self.saveButton)
    /* asynchronous REST call */
    UserDataManager.sharedInstance.requestFeedback(request, onCompletion: { error in
        dispatch_async(dispatch_get_main_queue(),{
        /* closing the view */
        self.navigationController!.popViewControllerAnimated(true)
        /* resetting the saveButton again to default by setting customView to nil */
        self.saveButton.customView = nil
      })
    })
}

2

Эта ошибка начала появляться после того, как я добавил некоторых наблюдателей:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.keyboardWillHideOrShow(_:)), name:UIKeyboardWillShowNotification, object: nil)

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.keyboardWillHideOrShow(_:)), name:UIKeyboardWillHideNotification, object: nil)

Проблема исчезла, когда я указал имя класса вместо self:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyClass.keyboardWillHideOrShow(_:)), name:UIKeyboardWillShowNotification, object: nil)

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyClass.keyboardWillHideOrShow(_:)), name:UIKeyboardWillHideNotification, object: nil)

2

У меня была та же ошибка, и ни одна из вышеперечисленных не применима к моей проблеме. Проблема возникла, когда я зарегистрировал свой контроллер вида в качестве наблюдателя за изменением ориентации устройства, поэтому размеры видов можно было изменить, а рисунки на виде можно было сделать в соответствии с новым размером вида.

У меня был выход viewGraph, который был подклассом UIView, в котором я рисовал некоторую графику. В ландшафтном режиме размер viewGraph больше, чем в портретном режиме. Поэтому, когда устройство меняет свою ориентацию, необходимо перерисовать speedGraph.

Проблема заключалась в том, что я добавил несколько подпредставлений в представление speedGraph, которое содержало графику. Эти подпредставления необходимо заново выложить в представлении speedGraph, а затем перерисовать. После того, как устройство изменило свою ориентацию, я снова вызвал viewDidAppear, чтобы заново отобразить представление speedGraph и все его подпредставления и перерисовать их. Вызов setNeedsDisplay для speedGraph не работает с изменениями ориентации и подпредставлениями в представлении.

Что я сделал не так, что привело к появлению ошибки. В viewDidAppear я вызываю метод, который выполняет некоторые вычисления и добавляет подпредставления в представление speedGraph. Проблема заключалась в том, что эти подпредставления были созданы в методе и были добавлены в представление speedGraph в этом методе. После выхода из метода ссылки на эти подпредставления, конечно, удаляются, но подпредставления в представлении speedGraph остаются, поскольку они добавлены. Когда устройство меняется, подпредставления создаются снова и добавляются в представление speedGraph, которое уже имеет эти подпредставления, но больше не может найти ссылки на эти подпредставления. Массив подпредставлений представления speedGraph становится длиннее и длиннее с (я думаю) висящими подпредставлениями.

Я решил проблему, определив подпредставления, которые будут добавлены в представление speedGraph как свойство класса, а затем сделайте то, что нужно сделать с представлениями внутри этого метода. С этим изменением проблема исчезла.


2

Так как мы можем публиковать все ситуации, возвращающие одну и ту же ошибку, я не стесняюсь публиковать мои :). Ошибка при изменении настроек конфиденциальности в фоновом режиме. Мое приложение открыло приложение настроек, чтобы пользователь мог предоставить ему разрешение для своей фотобиблиотеки. Когда переключатель разрешения установлен, приложение вылетает с ошибкой:

_BSMachError: (os/kern) invalid capability (20)
_BSMachError: (os/kern) invalid name (15)

Похоже, это принудительный перезапуск вашего приложения операционной системой, потому что пользователь изменил доступ к вашему приложению. Так что в моем случае это действие ОС, вызвавшее ошибку.


Я тоже это получил. Так что это на самом деле не ошибка. Когда приложение не подключено к Xcode, ничего страшного не произойдет. Спасибо, брат, вы можете просто сэкономить часы моего времени на отладку.
Юдзи

1

Я получил такое же сообщение об ошибке, потому что assignв objectсобственности , как @property (assign, nonatomic) NSNumber *aVariable;, закрепленное за счет изменения в strong.


1

Для чего это стоит - кажется, что многие ситуации выдают эту ошибку. В моем случае я разместил предупреждение, когда пользователь отклонял форму ввода данных, и данные были в форме. Мне удалось устранить ошибку, программно отменив первый ответчик из всех применимых полей, прежде чем раскрутить контроллер представления.


У меня тоже есть эта проблема, но, поскольку контроллер представления отклоняется кнопкой «Назад» на панели навигации контроллера навигации, prepareForSegue()он не вызывается, и я не знаю, где оставить первого респондента.
TimSim

1

Я видел это, когда нажимал Homeкнопку во время UIAlertControllerотображения a , которая была закрыта при повторном запуске приложения. Я добавил код для отклонения UIAlertControllerв appDelegate:

func applicationWillResignActive(application: UIApplication) {
  window?.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
}

и сообщение об ошибке исчезло.


1

У меня была эта ошибка при отклонении поповера через делегата. В методе делегата я вызвал некоторые GUI-вещи. Помещение GUI-Stuff в завершениеБлок dismissViewControllerAnimated исправил это.

[myPopoverView dismissViewControllerAnimated:YES completion:^{ //GUI-Stuff}];

1

Я новичок в этом, поэтому примите это за то, что оно того стоит.

Для меня это исправило изменение симулированной метрики> размера> на полноэкранный режим iPad. Все мои взгляды, КРОМЕ того, что выкинуло эту ошибку, мы установили на iPad Full Screen. Когда я его изменил, ошибка ушла ...


1

Причина, по которой некоторые разработчики не получают сообщение об ошибке после перехода с «Unites States» на «en» (или) в другом регионе, заключается в том, что существует несоответствие между представлениями «Список свойств» и «Исходный код». Это, вероятно, ошибка Xcode. Всякий раз, когда есть несоответствие между этими двумя представлениями, выдает эту ошибку, независимо от того, является ли она "en" или "английским". Если вы изменили «en» или «United States», чтобы оба представления были одинаковыми, проблема будет устранена.


1

Я получил эту ошибку от:

var promptsArr =  StartRegAlerts() //Instance of the class

и т.д

func textFieldDidBeginEditing(textField: UITextField) {     
    switch textField.tag {
            case 0:
                alert(promptsArr.prompts["Name"]!)
            case 1:
                alert(promptsArr.prompts["CellPhone"]!)
            case 4:
                alert2(promptsArr.prompts["NUMBERCORRECT"]!)
                //alert(promptsArr.prompts["Wait4Pin"]!)

            default: break
            }
It only occurred for case 0 but not the other cases:
As a work around for now I commented out case 0 and that stopped the error.
I then changed  calling promptsArr.prompts by:

создание нового словарного приглашения и:

 override func viewDidAppear(animated: Bool) {
             prompt = promptsArr.prompts //
      }

а потом использовал подсказку в моих звонках. Это решило проблему.

Таким образом, похоже, что это проблема времени.


Я боюсь, что это работало только некоторое время, а затем появилось снова, поэтому комментирование случая 1, а затем вызов этого оповещения позже, похоже, решило проблему.
Джереми

0

с Xcode 8.1 и iOs 10 я тоже сталкивался

_BSMachError: (os / kern) недопустимая возможность (20)

_BSMachError: (os / kern) неверное имя (15)

пытаясь переопределить UiTraiCollection var, чтобы изменить во время выполнения классы размера iPad, чтобы иметь два разных макета интерфейса в Portraid и Landscape. Он работал без сбоев, но генерировал наши ошибки.

Это был код "maliciuos":

override public var traitCollection: UITraitCollection {
    if UIDevice.currentDevice().userInterfaceIdiom == .Pad && UIDevice.currentDevice().orientation.isPortrait.boolValue {
        return UITraitCollection(traitsFromCollections:[UITraitCollection(horizontalSizeClass: .Compact), UITraitCollection(verticalSizeClass: .Regular)])
    }
    return super.traitCollection
}

Ошибки, использованные в override func viewWillTransitionкачестве альтернативы для обнаружения поворота интерфейса.

Надеюсь это кому-нибудь пригодится


0

В моем случае причиной ошибки было изменение размера. Построен в ИБ. Все, что может изменить размер текстового поля или подобное, например, изменение длины строки, может привести к этой ошибке, я считаю. В моем случае мне просто пришлось отрегулировать размер текстового поля, чтобы охватить все возможности, чтобы не нужно было изменять размер поля и конфликтовать с чем-то другим.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.