Objective c e使用iOS 6.0 GM关闭会话时出现辅助错误

Objective c e使用iOS 6.0 GM关闭会话时出现辅助错误,objective-c,ios6,mfi,xcode4.5,nscondition,Objective C,Ios6,Mfi,Xcode4.5,Nscondition,有一个MFI设备通过蓝牙(2.1+EDR)连接到iPhone 4S(6.0 GM)或iPad(6.0 GM)。该项目基于Xcode 4.5 GM构建。当应用程序获得EAAccessoryDidDisconnectNotification时,它将发送消息[\u eaSessionController closeSession]。所有这些都在iOS 5.1.1或更早版本中运行良好。但在iOS6上,我收到了如下日志: -[NSCondition dealloc]: condition (<NSC

有一个MFI设备通过蓝牙(2.1+EDR)连接到iPhone 4S(6.0 GM)或iPad(6.0 GM)。该项目基于Xcode 4.5 GM构建。当应用程序获得
EAAccessoryDidDisconnectNotification
时,它将发送消息
[\u eaSessionController closeSession]。所有这些都在iOS 5.1.1或更早版本中运行良好。但在iOS6上,我收到了如下日志:

-[NSCondition dealloc]: condition (<NSCondition: 0x2e5640> '(null)') deallocated while still in use
Break on _NSLockError() to debug.
-[NSCondition dealloc]:在仍在使用时解除分配的条件('(null)')
中断_NSLockError()以进行调试。

有什么想法吗

我遇到了同样的问题。收到EAAccessoryDidDisconnectNotification调用[NSStream close]时会引发此警告。在断开连接之前,两个设备之间还应该进行一些数据交换

Breaking on _NSLockError将显示在解除分配对象时,外部附件框架生成的一些线程正在等待条件。其中一个当然会等待被释放的条件,这解释了控制台上抛出的警告

我还注意到,每次附件断开连接时,外部附件框架创建的线程数量都在不断增加,它们似乎只是在泄漏

在我看来,不知何故,外部附属框架没有适当地释放它分配的资源,这导致了很多混乱。这种情况的后续影响之一是在调用OSAtomicCompareAndSwap64期间,其中一个泄漏线程内部发生崩溃

我使用一个基本示例成功地重现了这个问题,其中流被安排在主线程上,以避免应用程序内部的任何线程管理。我相信苹果应该注意iOS 6上的配件管理漏洞。我会报告的,等他们说什么

同时,我想知道你们当中是否有人在这方面取得了任何进展


谢谢,

iOS 6.1+中没有这样的问题。要解决iOS 6.0和iOS 6.0.1的此问题,请使用下一个解决方案:

请注意:这是唯一允许iOS 6.0和6.0.1用户继续使用您的应用程序的临时解决方案

有一种简单的方法可以避免应用程序崩溃:只需为iOS 6.0和iOS 6.0.1创建新类别并覆盖dealloc方法(NSCondition):

#import "NSCondition+LeakDealloc.h"
#import <objc/runtime.h>

@implementation NSCondition (LeakDealloc)

- (void) safeDealloc
{
    float sVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (sVersion < 6.0 || sVersion >= 6.1)
    {
        [self safeDealloc];
    }
}

+ (void) load 
{
    method_exchangeImplementations(class_getInstanceMethod(self, @selector(dealloc)), class_getInstanceMethod(self, @selector(safeDealloc)));
}

@end
#导入“NSCondition+leakdelock.h”
#进口
@实施条件(LEAKDEALOC)
-(无效)安全解除锁定
{
float sVersion=[[[UIDevice currentDevice]系统版本]floatValue];
如果(sVersion<6.0 | | sVersion>=6.1)
{
[自我保护];
}
}
+(空)荷载
{
方法交换实现(类getInstanceMethod(self,@selector(dealloc)),类getInstanceMethod(self,@selector(safeDealloc));
}
@结束

此解决方案产生新的泄漏,经过20分钟的测试和大约50个BG/FG开关仪器显示10个条件泄漏(960字节),但没有一个崩溃

该问题已在iOS 6.1中修复。
不再有泄漏的N条件或外部附件螺纹。苹果似乎已经妥善解决了这个问题。

我的处境和你一样。我们有低功耗蓝牙设备,可以定期连接和断开连接。当手机实际连接到调试器时,如果应用程序在后台,我会在日志中看到错误。如果我没有连接到调试器,它就会崩溃。你有没有向苹果公司提交bug?没有,我没有向苹果公司报告这个问题。>>“低功耗蓝牙设备”你的意思是“蓝牙4.0低能耗”吗?不,我想是它的蓝牙2.1,不是新的4.0。它会自行断开和重新连接,而我只是使用连接通知来触发我的读写操作,并导致它断开连接。不,我没有进一步了解这一点。我想我也会提交一个bug。希望这将有助于推动他们更快地修复它。不过,我已经看到了泄漏的线程问题,并开始为其提供支持。他们让我为它提交了一份bug报告,我们送了一个设备给他们测试。前几天我被告知,他们意识到并理解这个问题。他们只是没有说是否以及何时会得到修复。如果我猜他们可能会在iOS 6上修复它。谢谢Paul的更新。我猜你指的是iOS 6.1,因为iOS 6.0下已经存在这个问题:)您好。我至少在iOS 6.0.1上没有这个问题,但在iOS 6.1.X上也一样。实际上,它在NSRecursiveLock dealloc上崩溃。我的第一个解决方法是“关闭会话时不要设置为零”。我还尝试了你的解决方案,它也适用于一个类别。苹果开发者论坛上有一篇公开的帖子提到了这个问题,并打开了一个bug()。我真的很惊讶这个bug仍然存在,而且在网络上没有太多的反馈。我们是少数人,还是会话出了问题?在我的例子中,我们只有一些不受欢迎的过渡版本崩溃。。但对于流行的iOS版本,所有这些都可以正常工作。看来就是这样了。请与我们联系您的错误报告状态。