Question

Je suis confus au sujet du comte ref dans NPAPI. La plupart du temps, je ne sais pas quelle méthode va augmenter le nombre de ref. Quelqu'un peut-il expliquer en détail à ce sujet? Pour la commodité, j'ai énuméré les plus couramment utilisés NPN_ * fonctions ici et ma propre compréhension:

NPN_CreateObject: ref nombre réglé sur 0

NPN_RetainObject: nombre inc ref

NPN_ReleaseObject: nombre dec ref

NPN_Evaluate: ?? (Dans le cas d'un retour NPObject *)

NPN_GetValue: ?? (Dans le cas d'un retour NPObject *)

NPN_SetValue: ?? (Dans le cas fixé à un NPObject *)

NPN_GetProperty: ?? (Dans le cas d'un retour NPObject *)

NPN_SetProperty: ?? (Dans le cas fixé à un NPObject *)

NPN_RemoveProperty: ??

NPN_Enumerate: ??

NPN_Construct: ??

Une autre chose: est NPAPI faire libération imbriquée? (En cas NPObject * avec une propriété de NPObject *, un parent de libération diminuera le nombre d'enfants ref).

Merci.

Était-ce utile?

La solution

Il n'y a pas de place dans les commentaires pour répondre à votre question dans le commentaire, donc je vais le mettre dans une autre réponse.

Chaque fois que votre code obtient un NPObject d'une fonction NPObject (un de ceux que vous avez mentionné ci-dessus), vous devez libérer cette NPObject lorsque vous avez terminé avec elle. (Qui pourrait être immédiatement, ou vous pourriez pendant un certain temps sauver et libérer lorsque votre objet est détruit). La même chose est vraie avec un NPVariant. Finalité pas RÉALITÉ avec les arguments passés dans votre fonction Invoke, mais la valeur de retour que vous paramétrez faire libérer par le navigateur quand il est fait.

Lorsque vous appelez NPN_GetValue et obtenez un NPObject à partir de là, qui doit également être libéré. Cela signifie que lorsque le navigateur appelle NPP_GetValue, il libérera votre NPObject quand il est fait. Si vous voulez créer un nouveau NPObject chaque fois que le navigateur appelle NPP_GetValue pour obtenir votre NPObject, alors vous ne devez pas appeler NPN_RetainObject là-dessus; l'hypothèse dans l'exemple NPAPI est que vous enregistrez une copie de votre NPObject afin qu'il ne soit pas effacé jusqu'à ce que votre objet plugin est supprimé.

Depuis le navigateur .L'appel pour chaque fois qu'il appelle NPP_GetValue pour obtenir votre NPObject, vous devez vous assurer que le refcount est incrémenté avant de le retourner. La raison pour laquelle vous ne devez pas l'appeler deux fois dans le cas où vous allez le garder est que NPN_CreateObject fait implicitement Retain avant de retourner votre objet.

J'ai écrit une explication plus détaillée ici:

Autres conseils

D'abord, pour corriger une idée fausse: NPN_CreateObject définit le Refcount à 1, et non à 0. Ensuite, lorsque vous appelez NPN_RetainObject il incrémente le refcount et NPN_ReleaseObject le décrémentera. Si ReleaseObject décrémente le refcount à 0, il sera également gratuit en appelant la fonction deallocate de votre NPClass (qui devrait supprimer le NPObject après avoir fait tout nettoyage nécessaire)

voir: https://developer.mozilla.org/En/NPClass

au-delà, une bonne règle générale pour l'une des autres fonctions NPClass est que chaque fois que vous mettez un NPObject dans un NPVariant, vous devez appeler NPN_RetainObject. Pour ne pas oublier cela, rappelez-vous simplement que lorsque vous avez terminé avec un NPVariant (celui que vous avez utilisé et sont faites avec, pas un qui a été adoptée comme une valeur de retour), vous appelez NPN_ReleaseVariantValue, qui va libérer les données NPString si elle est un chaîne ou NPObject si elle est un objet.

de l'une des autres méthodes, si vous retournez un NPObject, vous devez appeler NPN_RetainObject avant de le farcir dans le NPVariant. En outre, si vous enregistrez une copie de la NPObject, vous devez appeler NPN_RetainObject sur et NPN_ReleaseObject lorsque vous enregistrez fait. Il porte aussi de mentionner que vous ne devriez jamais appeler une méthode NPN_ à partir d'un autre thread que le thread principal.

Est-ce que l'aide?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top