-1

NSProxy を使用してオブジェクトをラップし、(forwardInvocation:) で呼び出しの retValue としてプロキシ インスタンスを作成しようとしましたが、すべてのプロキシ インスタンスを ARC で解放することはできません。ずっと悩んでいました。

github でのデモ: https://github.com/JorrisRaghan/proxyon

コンソール ログを表示できます。

DEALLOC PPObject:...

DEALLOC Proxyon:Class< PPObject >

ただし、DEALLOC Proxyon:id< PPObject >" はありません。

また、Instruments を使用してメモリ リークをチェックすることもできます。

だから私はそれを解決するためにあなたの助けが必要です、ありがとう!

更新: このリークは forwardInvocation によるものであることがわかりました:

void *proxyon = (__bridge_retained void *)[Proxyon proxyonWithInstance:obj];
[anInvocation setReturnValue:&proxyon];

Proxyon インスタンスの代わりに retVal として PPObject を設定したところ、PPObject でリークが発生したため、-[NSInvocation setReturnValue:] が鍵になると思います。

4

1 に答える 1

0

__bridge_retainedキャストが間違っているようです。__bridge_retained保持された参照を提供します。次に、これを呼び出しの戻り値として設定し、バランシング リリースを行わないため、呼び出しが保持された参照を返すという効果があります。ただし、これが対象となるメソッドの名前 ( ) は、、、、、、またはでinstanceWithIdentifier:始まっていないため、保持された参照を返すべきではありません。allocnewretaincopymutableCopy

__bridge単純なキャストに変更すると、再びバランスが取れます。

于 2017-06-12T21:53:41.423 に答える