错误消息“ _ BSMachError: (os/kern)无效能力(20)”

请注意,这个错误消息级别很低,因此在不同的场景中会出现不同的原因。如果您有一个场景没有在下面的答案中提到,请考虑添加您的情况,所以也许这可以作为各种情况的中心答案,引起这个错误消息。

编辑2015年11月10日同样注意,我标记了我自己的答案作为答案,但那是在其他人发表之前。我想没有一个真正应该被标记为答案,因为我们现在已经看到下面... 这个错误没有只有一个答案,因为它是如此低的水平。

我在跑步

  • IOS 9.0模拟器
  • XCode 7.0

昨天一切都很好。

今天,在进行了一系列与旋转相关的工作之后,当我在模拟器中运行应用程序并旋转它时,我开始在控制台输出中得到这个错误。

_ BSMachError: (os/kern)无效能力(20)

_ BSMachError: (os/kern)无效名称(15)

Screenshot for this issue 我已经清空了我的构建文件夹, 我已经清理了衍生数据文件夹, 我重置了模拟器。

一起工作

  • UIViewController viewWillLayoutSubviews
  • UIViewController viewWillTransitionToSize:...

我还检查了 IB 中属性检查器的各种“绘图”设置。

我还在 UIView 上创建了一个实用工具类别,在这里我创建了一系列创建 CGRect的方法,并帮助我为视图分配框架。

Root View Controller

Root View Controller Settings

94348 次浏览

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

enter image description here

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

> _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开始的。

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

info.plist中的“ 本地化自主开发区”更改为美国,而不是 en

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

我得到了相同的错误消息,因为我 assign一个类似 @property (assign, nonatomic) NSNumber *aVariable;object属性,通过更改为 strong修复。

我还遇到了 _BSMachError控制台错误,当时我通过 UIAlertController操作深度链接到 iOS9上的设置应用程序。dispatch_async解决了我的问题:

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

在我的案例中,它是 Little Snitch,它会自动屏蔽 url。

我可以为自己复制这个错误: 如果对我实际上已经关闭的视图中的一个视图(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
})
})
}

我在一个运行在后台线程上的 NSOperation 中也遇到了同样的问题,我仍然得到这个错误,因为当另一个 UI 事务试图发生时,UIAlertController 仍然在移除它自己。把我的代码修改成这样就解决了这个问题。

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

许多人不知道延迟-它让当前范围完成,然后运行之后。挺整洁的。

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

  1. 选择 Project Navigator
  2. 定位 ProjectNameTest 文件夹中的 info.plist文件。
  3. Localization native development region key的值更改为任何特定区域 等等。英国

Step 1 and 2

Step 3

无论如何,似乎很多情况都会抛出这个错误。在我的例子中,当用户丢弃数据输入表单并且数据在表单中时,我发布了一个警告。在展开视图控制器之前,我能够通过编程从所有适用的字段中重新设置第一响应者来消除这个错误。

我看到了这一点,当我按下 Home按钮,而一个 UIAlertController显示,这是解散时,我重新启动应用程序。我在 appDelegate中添加了解散 UIAlertController的代码:

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

错误消息消失。

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

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

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

但这些解决方案都没有解决我的问题。 实际上,我正在尝试共享一些文档,但是生成文档需要一些时间,并且希望在文档加载之前向用户显示一个 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;
}];
});
});

我在通过委托忽略一个弹出窗口时出现了这个错误。 将 GUI-Stuff 放入 distisViewControllerAnimated 的补全块中,修复了它。

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

我也犯了同样的错误。

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

我在这方面是个新手,所以不管怎样,拿着这个。

对我来说,修复这个问题的方法是将模拟度量 > 大小 > 改为 iPad 全屏。我所有的视图,除了一个抛出这个错误,我们设置为 iPad 全屏。当我修改时,错误消失了。

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

至于原因?我想我不小心按了一个快捷键,在当前行中创建了一个断点。因为这是意外,我再次点击同一个快捷键删除它。

我亲爱的 XCode。

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

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)

我也犯了同样的错误,而上述的错误都不适用于我的问题。当我将视图控制器注册为设备方向变化的观察者时,问题出现了,因此视图可以调整大小,视图中的图形可以根据视图的新大小进行绘制。

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

问题在于,我向 speed Graph 视图添加了几个包含图形的子视图。这些子视图需要在 Speed Graph 视图中重新布局,然后重新绘制。在设备改变了它的方向后,我再次调用 viewDidAppear 来创建 Speed Graph 视图及其所有子视图,以便重新布局并重新绘制它们自己。对 SpeedGraph 调用 setNeedsDisplay 无法处理视图中的方向更改和子视图。

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

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

将本地化字符串从 en 更改为 United States 为我修复了这个问题。但是,请确保在更改 Info.plist 之后进行清理。我已经注意到,当您在更改 plist 之后才进行构建时,更新是无法工作的。enter image description here

我得到了这个错误:

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

然后在我的提醒电话中使用提示。这解决了问题。

看来是时间问题。

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

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

这似乎是操作系统强制重启你的应用程序,因为用户改变了你的应用程序可以访问的内容。所以在我的案例中,是操作系统的行为导致了错误。

与 Xcode 8.1和 iOs 10一样,我也面临着

_ BSMachError: (os/kern)无效能力(20)

_ BSMachError: (os/kern)无效名称(15)

试图覆盖 uiTraiCollection var 以在运行时更改 iPad 的大小类,使其在 Portraid 和 scape 中具有两种不同的界面布局。它在没有崩溃的情况下工作,但是产生了我们的错误。

这就是“恶意”代码:

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作为检测接口旋转的替代方法发生的错误。

我希望这对某人有用

在我的例子中,错误的原因是由于调整了大小。内置 IB。我相信任何可以改变文本字段大小或类似内容(例如改变行长)的东西都会导致这个错误。在我的例子中,我只需要调整文本字段的大小,以覆盖所有可能性,这样就不需要调整框的大小,也不会与其他内容发生冲突。