Pregunta

Estoy confundido acerca de la referencia de recuento en npapi.En su mayoría, no sé cuál es el método de aumento del recuento de ref.Puede alguien explicar en detalle acerca de esto?Para la conveniencia, que se enumeran más comunes utilizados NPN_* funciones de aquí y de mi propio entendimiento:

NPN_CreateObject:conjunto de ref conteo a 0

NPN_RetainObject:inc recuento de ref

NPN_ReleaseObject:dec recuento de ref

NPN_Evaluate:??(en caso de devolución de un NPObject*)

NPN_GetValue:??(en caso de devolución de un NPObject*)

NPN_SetValue:??(en caso de establecer un NPObject*)

NPN_GetProperty:??(en caso de devolución de un NPObject*)

NPN_SetProperty:??(en caso de establecer un NPObject*)

NPN_RemoveProperty:??

NPN_Enumerate:??

NPN_Construct:??

otra cosa:es npapi hacer anidada de la liberación?(En caso de que NPObject* con una propiedad de NPObject*, la liberación de los padres va a disminuir el recuento de ref de niño).

Gracias.

¿Fue útil?

Solución

No hay espacio en los comentarios para responder a tu pregunta en el comentario bien, así que voy a poner en otra respuesta.

Cualquier momento en que el código se obtiene un NPObject de un NPObject función (uno de los que se menciona más arriba), usted debe de Liberación que NPObject cuando haya terminado con él.(que podría ser de inmediato, o se puede guardar por un tiempo y suéltelo cuando su objeto es destruido).Lo mismo ocurre con un NPVariant.No no cierto con los argumentos pasados en su Invocar la función, pero el valor de retorno que se liberan por el navegador cuando se hace.

Cuando llame NPN_GetValue y obtener un NPObject de allí, que también tiene que ser puesto en libertad.Esto significa que cuando el navegador se llama NPP_GetValue, que dará a conocer su NPObject cuando se hace.Si desea crear un nuevo NPObject cada vez que el navegador llamadas NPP_GetValue para obtener su NPObject, entonces usted no tiene que llamar a NPN_RetainObject en él;la asunción en el NPAPI ejemplo es que se va a guardar una copia de su NPObject para que no se borran hasta que su plugin objeto se elimina.

Desde el navegador de la llamada Liberación para cada vez que se llama a NPP_GetValue para obtener su NPObject, usted necesita para asegurarse de que el recuento se incrementa antes de devolverla.La razón que usted no tiene que llamar dos veces en el caso de que usted va a mantener es que NPN_CreateObject hace un implícita de Retener antes de devolver el objeto.

He escrito una explicación más detallada aquí:

Otros consejos

En primer lugar, para corregir un error: NPN_CreateObject establece el refcount a 1, no a 0. Entonces, cuando se llama NPN_RetainObject incrementa el refcount y NPN_ReleaseObject va a disminuirlo. Si disminuye el ReleaseObject refcount a 0, sino que también va a liberar llamando a la función deallocate de su NPClass (que debería eliminar la NPObject después de hacer cualquier limpieza necesaria)

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

más allá de eso, una buena regla general para cualquiera de las otras funciones NPClass es que cada vez que pones un NPObject en un NPVariant, tiene que llamar NPN_RetainObject. Para recordar esto, basta con recordar que cuando haya terminado con un NPVariant (uno que ha utilizado y está hecho con, no uno que se pasó como un valor de retorno), se llama a NPN_ReleaseVariantValue, que dará a conocer los datos NPString si es una cuerda o la NPObject si se trata de un objeto.

Así que desde cualquiera de los otros métodos, si va a devolver un NPObject, es necesario llamar NPN_RetainObject antes de la rellena en el NPVariant. Además, si se guarda una copia de la NPObject, debe llamar NPN_RetainObject en él y NPN_ReleaseObject cuando haya terminado de guardarlo. También vale la pena mencionar que nunca se debe llamar a cualquier método NPN_ de un hilo que no sea el hilo principal.

¿Le ayuda?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top