【问题标题】:Error message '_BSMachError: (os/kern) invalid capability (20)'错误消息“_BSMachError:(os/kern)无效能力(20)”
【发布时间】:2015-12-30 05:11:36
【问题描述】:

请注意,此错误消息级别非常低,因此在不同情况下会出于不同原因出现。如果您有以下答案之一未提及的场景,请考虑添加您的情况,因此这可能是引发此错误消息的各种情况的中心答案。

2015 年 11 月 10 日编辑 另请注意,我将自己的答案标记为答案,但这是在其他人发布之前。我想没有一个真正应该被标记为答案,因为正如我们现在在下面看到的那样......这个错误不仅仅是一个答案,因为它的级别太低了。

我在跑步

  • iOS 9.0 模拟器
  • XCode 7.0

昨天一切正常。

今天,经过大量与旋转相关的工作后,当我在模拟器中运行应用程序并旋转它时,我的控制台输出中开始出现此错误。

_BSMachError: (os/kern) 无效能力 (20)

_BSMachError: (os/kern) 无效名称 (15)

- 我已经清除了我的构建文件夹, - 我已经清理了派生数据文件夹, - 我已经重置了模拟器。

我在工作

  • UIViewController viewWillLayoutSubviews
  • UIViewController viewWillTransitionToSize:...

我还在 IB 的 Attributes Inspector 上检查各种“绘图”设置。

我还在 UIView 上创建了一个实用程序类别,在那里我创建了一堆创建 CGRect 的方法,并帮助我将框架分配给视图。

【问题讨论】:

  • 我在使用 BLE 时遇到此错误
  • 我还没有找到解决方案,而且我也在旋转时得到它。有时我也会在不久之后收到内存警告,即使 Xcode 报告只使用了少量内存。令人沮丧。
  • 好想你编辑了MyFoodTracker:P
  • 为什么 MyFoodTracker 在屏幕截图中被红线划掉了?
  • @LogicsaurusRex “这是什么意思?”确实不是一个有用的问题,而是“它需要修复吗?”可能是一个更好的问题(我想要答案)。我的应用程序似乎工作正常,但显示此错误。我很想把它固定下来并修复它,但这不是一个小应用程序,找到它会花费我宝贵的时间。

标签: ios objective-c xcode7


【解决方案1】:

基于https://forums.developer.apple.com/thread/15683

info.plist 中的“Localization native development region”更改为美国而不是en

更新:然后您可以恢复这些更改。

【讨论】:

  • 它也对我有用。然后我将设置恢复为“en”,错误似乎不再出现。
  • 它作为发生此错误的新实例对我有用。我在此处发布了原始帖子,但由于其中一个绘图复选框而出现此错误。它消失了很长时间,现在由于其他未知原因再次出现,并且更改它实际上修复了它... HOLY COW 太棒了。
  • 我的设置为ja,而不是en。我该怎么办?设置为Japan?
  • 这行得通。但是再次恢复为 en 并且没有错误?
  • 我不太喜欢这样的答案。因为它什么都解释不了。它是 XCode 上的错误吗?是不是我们的代码定位不对?还是什么?
【解决方案2】:

在从UIAlertController 操作深度链接到 iOS 9 上的“设置”应用时,我还遇到了_BSMachError 控制台错误。 dispatch_async 解决了我的问题:

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

【讨论】:

  • 这为我消除了控制台错误,但我试图修复同时发生的主要锁定错误并没有帮助
  • 可能可以概括这个答案,我在 uialertcontroller 中执行 segue 时得到了我的答案(几乎相同的代码)。可能与警报控制器如何使自己脱离画面有关。也解决了我的 dispatch_async 问题。
  • 这里有同样的问题 - 特别是在 9.2 模拟器中,当通过 UIAlertController 中的 UIAlertAction 处理程序从我的应用程序中进入系统设置时,就会发生这种情况。当我将代码重写为 UIAlertController 而不是旧的 UIAlertView 时,sim 引发了相同的 _BSMach 错误 (15,20)。未在真实设备 (ipad) 上发生。 Dispatch_async 确实让模拟器很开心。肯定和 UIAlertController 有关。
  • 同样的问题再次出现,这次不是在 sim 上,而是在 ipad 上,而不是在 sim 上。这次是一些代码将视图呈现为导致机器错误的pdf上下文。再次 dispatch_async 修复它。我还验证了当此代码在未从 UIAlertController 中的 UIAlertAction 的完成处理程序调用的情况下执行时,不会发生此错误。在我的两种情况下,错误仅在 XCode 调试控制台中可见,并且应用程序继续正确执行。此线程上建议的本地化想法对这两种情况都没有任何影响。
  • @Jason 我遇到了同样的问题,它删除了控制台错误消息,但它仍然崩溃。您设法以某种方式解决了吗?
【解决方案3】:

好的,我还没有完全确定它,但这会让你完成 99% 的工作。 我正在使用来自 ESRI 的第三方地图控件,并且它不喜欢属性检查器中的这些绘图设置之一。我没有单独尝试每个设置来查看它是哪个设置,但是当我关闭所有设置(在红色框中)时,一切都像魅力一样,我不再在控制台中收到上面的错误消息。如果并且当我有时间将其确定为精确的设置或设置组合时,我会更新答案。

【讨论】:

  • 我觉得你的回答很好。但是,我会删除顶部的粗体文本。最近有很多匿名的答案,我怀疑这是个人问题。
  • 如果我必须使用其中之一怎么办?
【解决方案4】:

这很疯狂,但对我来说,解决方案就是删除文件中发生错误的所有断点。

至于原因?我想我不小心按了快捷键在当前行创建断点。因为那是无意的,所以我再次按下相同的快捷键将其删除。

哦,我亲爱的 XCode...

【讨论】:

  • 这对我有用。这是问题所在的一个线索是 Xcode 会在没有断点的行上中断。然后,在另一行,我得到了上面的 _BSMachErrors。
【解决方案5】:

我遇到了同样的错误...

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

我从 UIAlertAction 调用 openURL()

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)}
 }

【讨论】:

    【解决方案6】:

    我在提供新数据时得到以下信息:

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

    使用按钮提供新数据时发生错误。 NSTimer 用于在从 performSegueWithIdentifier 操作返回时刷新和更新数据。计时器被激活,然后在返回时间使用后立即失效。 MSMachError 在定时器被移除时停止,并且 - (void)viewWillAppear:(BOOL)animated(void)viewDidAppear:(BOOL)animated 被用来执行相同的功能。此错误始于升级到 Xcode 7。

    【讨论】:

      【解决方案7】:

      我通过将 Localization native development region 键的值从项目的 info.plist 中的默认值 en 更改为 United Kingdom [或任何特定区域] 解决了这个问题。

      1. 选择Project Navigator
      2. 在 ProjectNameTests 文件夹中找到 info.plist 文件。
      3. Localization native development region key 的值更改为任何特定区域例如。英国

      【讨论】:

      • 是的,这个修复听起来很疯狂,但它确实有效。对我来说,当 Xcode 7.3.1 部署到连接的 iPod touch 第 5 代时,该应用程序可以正常工作。但是,当第一次从 Xcode 部署到系留的 iPad Air 时,我遇到了这个BSMachError。将区域切换到United States 使错误消失。又一个莫名其妙的 Xcode 谜团。
      【解决方案8】:

      我在后台线程上运行的 NSOperation 中也遇到了同样的问题,我仍然收到此错误,因为 UIAlertController 在尝试进行另一个 UI 事务时仍在删除自身。将我的代码修改为此解决了这个问题。

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

      很多人不知道 defer - 它让当前范围完成然后运行。有点整洁。

      【讨论】:

        【解决方案9】:

        我确实遇到了同样的错误,无效能力 (20) 和无效名称 (15)。我尝试了其他人提到的解决方案,例如:

        • info.plist 中的本地化原生开发区域键
        • 在属性检查器中更改绘图设置
        • 甚至更改了 info.plist 中的 ATS 异常字典

        但是这些解决方案都没有解决我的问题。 实际上,我正在尝试共享一些文档,但生成文档需要一些时间,并且希望在文档加载之前向用户显示 UIActivityIndi​​catorView。

        我的错误的解决方案是:

        //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;
            }];
        });
        });
        

        【讨论】:

        • 优秀,为我工作!重要的是要知道更新 UI 应该在 dispatch_get_main_queue() 中完成
        【解决方案10】:

        将本地化字符串从 en 更改为 United States 为我解决了这个问题。但是,请确保在更改 Info.plist 后进行清理。我注意到,当您在进行 plist 更改后才进行构建时,更新不起作用。

        【讨论】:

          【解决方案11】:

          在我的例子中,它是 Little Snitch,它会自动阻止 url。

          【讨论】:

            【解决方案12】:

            我可以为我重现错误: 如果对我实际上已经关闭的视图中的一个视图进行更改(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
                  })
                })
            }
            

            【讨论】:

              【解决方案13】:

              在我添加了一些观察者后,这个错误开始弹出:

              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)
              

              【讨论】:

                【解决方案14】:

                我遇到了同样的错误,以上都不适用于我的问题。当我将视图控制器注册为设备方向更改的观察者时出现了问题,因此可以调整视图的大小,并且可以根据视图的新大小制作视图中的绘图。

                我有一个 viewGraph 的出口,它是 UIView 的一个子类,我在其中绘制了一些图形。在横向模式下,viewGraph 的大小比在纵向模式下大。因此,当设备改变其方向时,需要重新绘制 speedGraph。

                问题是,我在 speedGraph 视图中添加了几个包含图形的子视图。这些子视图需要在 speedGraph 视图中重新布局,然后重新绘制。在设备改变其方向后,我再次调用 viewDidAppear 以使 speedGraph 视图及其所有子视图重新布局并重新绘制自己。为 speedGraph 调用 setNeedsDisplay 不适用于视图中的方向更改和子视图。

                我做错了什么导致错误出现。在 viewDidAppear 中,我调用了一个方法,该方法进行一些计算并将子视图添加到 speedGraph 视图中。问题是这些子视图是在方法中创建的,并在此方法中添加到 speedGraph 视图中。离开该方法后,对这些子视图的引用当然会被删除,但是 speedGraph 视图中的子视图仍然存在,因为它们被添加了。当设备发生变化时,子视图会再次创建并添加到 speedGraph 视图中,该视图已经具有这些子视图,但无法再找到对这些子视图的引用。 speedGraph 视图的子视图数组随着(我认为)悬空子视图变得越来越长。

                我通过将要添加到 speedGraph 视图的子视图定义为类属性来解决问题,然后在此方法中对视图执行需要完成的操作。有了这个改变,问题就消失了。

                【讨论】:

                  【解决方案15】:

                  因为我们可以在这里发布所有返回相同错误的情况,所以我可以随意发布我的 :)。在后台更改隐私设置时出现错误。我的应用程序打开了设置应用程序,因此用户可以授予它对其照片库的权限,当设置权限开关时,应用程序崩溃并显示错误:

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

                  这似乎是操作系统强制重启您的应用,因为用户更改了您的应用可以访问的内容。所以在我的情况下,是操作系统的行为导致了错误。

                  【讨论】:

                  • 我也有这个。所以这实际上不是一个错误。当应用程序未连接到 Xcode 时,不会发生任何可怕的事情。谢谢兄弟,您可能会节省我数小时的调试时间。
                  【解决方案16】:

                  我收到了同样的错误消息,因为我 assign 具有 object 属性,如 @property (assign, nonatomic) NSNumber *aVariable;,通过更改为 strong 来修复。

                  【讨论】:

                    【解决方案17】:

                    对于它的价值 - 似乎很多情况都会引发此错误。就我而言,当用户关闭数据输入表单并且数据在表单中时,我发布了一个警报。我能够通过在展开视图控制器之前以编程方式从所有适用字段中退出第一响应者来消除错误。

                    【讨论】:

                    • 这也是我遇到的问题,但是由于视图控制器被导航控制器导航栏中的后退按钮关闭,prepareForSegue() 没有被调用,我不知道在哪里辞职第一响应者。
                    【解决方案18】:

                    我在显示 UIAlertController 时按下 Home 按钮时看到了这一点,当我重新启动应用程序时该按钮被关闭。我添加了代码来关闭appDelegate 中的UIAlertController

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

                    错误信息消失了。

                    【讨论】:

                      【解决方案19】:

                      通过委托解除弹出框时出现此错误。在 delegateMethod 中,我触发了一些 GUI-Stuff。 将 GUI-Stuff 放在 dismissViewControllerAnimated 的 completionBlock 中修复它。

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

                      【讨论】:

                        【解决方案20】:

                        我是这方面的新手,所以要物有所值。

                        解决此问题的方法是将模拟指标 > 大小 > 更改为 iPad 全屏。我所有的观点,除了我们设置为 iPad 全屏的那个引发这个错误的观点。当我更改它时,错误消失了......

                        【讨论】:

                          【解决方案21】:

                          一些开发者在从“Unites States”更改为“en”(或)其他地区后没有收到错误消息的原因是“Property list”和“Source code”视图之间存在差异。这可能是 Xcode 错误。每当这两个视图不匹配时,无论是“en”还是“English”,都会抛出这个错误。如果您更改为“en”或“United States”以使两个视图相同,将解决此问题。

                          【讨论】:

                            【解决方案22】:

                            这个错误来自:

                            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,然后稍后调用该警报似乎已经解决了这个问题。
                            【解决方案23】:

                            我也遇到过 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 作为检测界面旋转的替代方法,错误消失了。

                            我希望这对某人有用

                            【讨论】:

                              【解决方案24】:

                              在我的情况下,错误的原因是由于调整大小。内置 IB。我相信任何可以改变文本字段大小或类似的东西,例如改变行长都可能导致这个错误。在我的情况下,我只需调整文本字段的大小以涵盖所有可能性,因此它不需要调整框的大小并与其他内容发生冲突。

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 2017-02-02
                                • 2015-10-21
                                • 2018-09-12
                                • 2021-04-01
                                • 2016-06-08
                                • 2016-07-22
                                • 2013-10-15
                                相关资源
                                最近更新 更多