1

NSMutableArrayで次のエラーが発生します。

  -[Not A Type release]: message sent to deallocated instance 0x1006e29c0

それはこの行で起こります:

     [_array removeAllObjects];

これで、エラーの意味は理解できましたが、この場合にエラーが発生する理由はわかりません。

上記の行の直前にNSLogを次のように追加しました。

      NSLog(@"%@", [_array class]);

そして、これは正常に実行され、正しい動作で、これはログです:

 2013-03-13 11:19:27.366 App[66921:303] __NSArrayM
 2013-03-13 11:19:27.367 App[66921:303] *** -[Not A Type release]: message sent to deallocated instance 0x1006e29c0

したがって、削除する直前に、割り当てが解除されていないようです。

removeAllObjects呼び出しを削除して以下の行に置き換えても、同じエラーが発生します。

     _array = [[NSMutableArray alloc] init];

コードの他の場所で行っているのは、[_ array addObject:...]を呼び出すことだけです。

_arrayは強力なプロパティです:

@property (strong) NSMutableArray *array;

配列は最初にinitメソッドで初期化されます。

編集:私は次のようにこの配列にAXUIElementRefsを追加しています:

 [_array addObject:(__bridge_transfer id)elementRef];

__bridge_transferがそれをARCに引き継ぐと思いましたが、それを管理する必要はありませんか?

何が問題なのですか?

更新:サンプルプロジェクトは次のとおりです:http://users.telenet.be/prullen/AXMemory.zip

__bridge_transferではなく__bridgeを使用しているため、これは作業中のプロジェクトです。

このプロジェクトには、同じことを何度も繰り返す単純なループが含まれています。これは、__ bridgeだけでは、AXUIElementRefsがリリースされないことを示すためです。彼らは記憶にとどまります。それは私がInstrumentsプロファイラーにも見ているものです。また、アクティビティモニターを介して、メモリ使用量が数秒ごとに増加していることを確認できます。

AXUIElementRefsはAXUIElementCopyMultipleAttributeValuesを介して取得されたので、私はそれらの所有権を持っていると思いますか?それでも、__ bridge_transferに変更すると、上記のエラーが発生します。

誰かがこれを見て、私が間違っていることを私に知らせてくれるなら、それは大いにありがたいです。

次のステートメントを介してプロパティの配列を取得します:(行60)。

         AXUIElementCopyMultipleAttributeValues(frontWindowRef, attributes,0,&attributeValues);

110行目AXUIElementを割り当てます(子配列をループします)。

             element = CFArrayGetValueAtIndex(childrenArrayRef, i);

112行目は、AXUIElementRefを配列に追加する場所です。

             [_array addObject:(__bridge id)(element)];

36行目は、500要素を超える場合に空にする場所です。

if ([_array count] > 500) {
    [_array removeAllObjects];
}
4

1 に答える 1

3

__bridge_transfer「それをARCに持ち込んで、それを管理する必要がない」と単純に想定することはできません。あなたはその時にあなたが持っていた権利と責任を理解する必要がありますelementRef(あなたが書いたものからはわかりません)。

CFBridgingRetain()対応する関数を使用すると、ブリッジキャストを理解するのがはるかに簡単になると思いますCFBridgingRelease()__bridge_transferと同じCFBridgingRelease()です。だから、問題は:あなたelementRefはその時に所有していますか?あなたがそれを解放することは適切ですか?

考えてみてください、次は正しいでしょうか?

[_array addObject:(__bridge id)elementRef];
CFRelease(elementRef);

そうでない場合は、どちらもそうではありません__bridge_transfer

発生しているエラーの性質から、リリースする資格がないことを強く疑っています。elementRefそのため、ARCに所有しており、リリースする必要があることを伝える権利はありませんでした。がAXUIElementRef過剰にリリースされました。キャストを使用する必要があります__bridge–「転送」も。もありませんCF…Release()

于 2013-03-13T13:02:40.340 に答える