1

Autorelease 関数でクラッシュするバグがあります。クラシック: オーバーリリース後にオブジェクトにアクセスします。

問題は、iOS プログラムが EAAccessory を使用しており、デバイスからデータを受信した結果としてどこかで発生していることです。

その結果、問題はシミュレータから診断する必要があります。NSZombie のメモリ要件により、NSZombie はシミュレーター以外の iOS では無効になっています。

シミュレータの外の iOS の世界で NSZombie を使用すると簡単にリリースされすぎたバグを追跡するためのヒントやアイデアはありますか?

シミュレーター用の EAAcessory の動作をスタブ化することは既に考えています。しかし、時間の制約により、必要な作業量のために「次のリファクタリング/機能強化」が必要になります。

今は、アクセス不良のバグを見つける必要があります。

4

1 に答える 1

1

私は EAAccessory の経験がないので、これが実行可能かどうかはわかりませんが、ここに提案があります。デバッグの保持/解放から(rentzsch.tumblr.com):

#if 1
- (id)retain {
    NSUInteger oldRetainCount = [super retainCount];
    id result = [super retain];
    NSUInteger newRetainCount = [super retainCount];
    printf("%s<%p> ++retainCount: %lu => %lu\n", [[self className] UTF8String], self, oldRetainCount, newRetainCount);
    printf("%s\n", [[[NSThread callStackSymbols] description] UTF8String]);
    return result;
}

- (void)release {
    NSUInteger oldRetainCount = [super retainCount];
    BOOL gonnaDealloc = oldRetainCount == 1;
    if (gonnaDealloc) {
        printf("%s<%p> --retainCount: 1 => 0 (gonna dealloc)\n", [[self className] UTF8String], self);
        printf("%s\n", [[[NSThread callStackSymbols] description] UTF8String]);
    }
    [super release];
    if (!gonnaDealloc) {
        NSUInteger newRetainCount = [super retainCount];
        printf("%s<%p> --retainCount: %lu => %lu\n", [[self className] UTF8String], self, oldRetainCount, newRetainCount);
        printf("%s\n", [[[NSThread callStackSymbols] description] UTF8String]);
    }
}
#endif

クラスごとにフィルターを追加して、疑わしい特定のクラスに対してのみデバッグ コードを実行できます。

于 2011-05-18T13:47:05.250 に答える