我对npapi中的引用计数感到困惑。通常,我不知道哪种方法会增加引用计数。谁能详细解释一下?为了方便起见,我在这里列出了最常用的NPN_ *函数以及我自己的理解:

NPN_CreateObject:将引用计数设置为0

NPN_RetainObject:公司引用计数

NPN_ReleaseObject:十进制引用计数

NPN_Evaluate:?? (以防返回NPObject *)

NPN_GetValue:? (以防返回NPObject *)

NPN_SetValue:? (如果设置为NPObject *)

NPN_GetProperty:? (以防返回NPObject *)

NPN_SetProperty:?? (如果设置为NPObject *)

NPN_RemoveProperty:??

NPN_Enumerate:??

NPN_Construct:?

另一件事:npapi是否嵌套发行? (如果NPObject *具有NPObject *属性,则释放父对象将减少子对象的引用计数)。

谢谢。

最佳答案

评论中没有空间可以很好地回答您的问题,因此我将其放在另一个答案中。

每当您的代码从NPObject函数(上面提到的其中一个)中获取NPObject时,完成后就应释放该NPObject。 (可以立即执行,也可以保存一段时间,然后在对象被销毁时将其释放)。 NPVariant也是如此。传递给Invoke函数的参数不正确,但是设置完成后,浏览器将释放您设置的返回值。

当您调用NPN_GetValue并从那里获取NPObject时,也必须将其释放。这意味着当浏览器调用NPP_GetValue时,它将在完成后释放您的NPObject。如果您想在每次浏览器调用NPP_GetValue来获取新的NPObject时创建一个新的NPObject,则不必在其上调用NPN_RetainObject。 NPAPI示例中的假设是您要保存NPObject的副本,以便在删除插件对象之前不会删除它。

由于浏览器每次调用NPP_GetValue来获取NPObject时都会调用Release,因此您需要确保在增加引用计数之前将其返回。如果要保留它,则不必两次调用它的原因是NPN_CreateObject在返回对象之前会执行隐式Retain。

我在这里写了更详细的解释:

  • http://colonelpanic.net/2009/12/memory-management-in-npapi
  • 08-27 00:05