【问题标题】:NSProxy forwardInvocation: Return an new NSProxy instance cause memory leakNSProxy forwardInvocation:返回一个新的 NSProxy 实例导致内存泄漏
【发布时间】:2017-06-07 18:42:50
【问题描述】:

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

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

你可以看到控制台日志:

DEALLOC PPObject:...

DEALLOC Proxyon:Class

但没有 DEALLOC Proxyon:id"。

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

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

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

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

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

【问题讨论】:

    标签: ios memory-leaks nsinvocation nsproxy


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 2011-02-01
      • 2017-01-06
      • 1970-01-01
      • 2015-06-18
      相关资源
      最近更新 更多