-1

我尝试使用 NSProxy 来包装对象并在 (forwardInvocation:) 中创建一个代理实例作为调用的 retValue,但不能在 ARC 中释放所有 proxyon 实例。我困扰了很久。

github 上的演示:https ://github.com/JorrisRaghan/proxyon

你可以看到控制台日志:

DEALLOC PP对象:...

DEALLOC Proxyon:Class< PPObject >

但没有 DEALLOC Proxyon:id< PPObject >"。

您还可以使用 Instruments 来检查内存泄漏。

所以我需要你的帮助来解决它,谢谢!

更新:我发现这个泄漏来自 forwardInvocation:

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

我将 PPObject 设置为 retVal 而不是 Proxyon 实例,并且在 PPObject 中发生了泄漏,所以我猜 -[NSInvocation setReturnValue:] 是关键。但是如何解决呢?

4

1 回答 1

0

__bridge_retained演员阵容看起来不对。__bridge_retained为您提供保留的参考。然后将其设置为调用的返回值,没有平衡释放,因此效果是调用返回一个保留的引用。但是 this 用于 ( instanceWithIdentifier:) 的方法的名称不以alloc, new, retain, copy, or开头mutableCopy,因此不应返回保留引用。

将其更改为简单的__bridge演员表应该使其再次平衡。

于 2017-06-12T21:53:41.423 回答