13

Bluetooth (2.1 + EDR) 経由で iPhone 4S (6.0 GM) または iPad (6.0 GM) に接続されている MFI デバイスがあります。プロジェクトは Xcode 4.5 GM で構築されました。アプリが取得EAAccessoryDidDisconnectNotificationすると、メッセージが送信されます[_eaSessionController closeSession];。これらはすべて、iOS 5.1.1 以前で問題なく動作しました。しかし、このメッセージが表示された iOS6 では、次のようなログを取得しました。

-[NSCondition dealloc]: condition (<NSCondition: 0x2e5640> '(null)') deallocated while still in use
Break on _NSLockError() to debug.

何か案は?

4

3 に答える 3

4

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

このソリューションは、20 分間のテストと約 50 の BG/FG 切り替え器の後、新しいリークを作成します。

于 2012-11-16T09:50:54.180 に答える
4

同じ問題に遭遇しました。この警告は、EAAccessoryDidDisconnectNotification の受信時に [NSStream close] を呼び出すとスローされます。また、切断の直前に 2 つのデバイス間で何らかのデータ交換が行われている必要があります。

_NSLockError で中断すると、オブジェクトの割り当てが解除された時点で、外部アクセサリ フレームワークによって生成されたスレッドの一部が条件付きで待機していることがわかります。それらの 1 つは、解放されている状態で確実に待機します。これは、コンソールにスローされる警告を説明しています。

また、外部アクセサリ フレームワークによって作成されたスレッドの数が、アクセサリが切断されてから接続されるたびに増加し続け、リークしているように見えることにも気付きました。

どういうわけか、外部アクセサリ フレームワークが割り当てたリソースを適切に解放せず、その結果、多くの混乱が生じているように思えます。これによるその後の影響の 1 つは、OSAtomicCompareAndSwap64 の呼び出し中にリークしたスレッドの 1 つの内部でクラッシュが発生することです。

アプリケーション内のスレッド管理を回避するためにストリームがメインスレッドでスケジュールされている基本的なサンプルを使用して、問題を再現することができました。Apple が認識すべきは、iOS 6 のアクセサリ管理のバグだと思います。私はそれを報告し、彼らが言わなければならないことを待ちます。

その間、あなた方の誰かがこれについて何らかの進歩を遂げたのだろうか.

ありがとう、

于 2012-10-05T13:20:08.207 に答える
1

この問題はiOS6.1で修正されています。NSConditionや外部アクセサリスレッドのリークはもうありません。Appleは問題を適切に修正したようです。

于 2013-01-29T11:16:15.150 に答える