2

npapiの参照カウントについて混乱しています。ほとんどの場合、どの方法で参照数が増えるかわかりません。誰かがこれについて詳しく説明できますか?便宜上、ここに最も一般的に使用されるNPN_ *関数と、私自身の理解をリストしました。

NPN_CreateObject:参照カウントを0に設定します

NPN_RetainObject:inc ref count

NPN_ReleaseObject:dec ref count

NPN_Evaluate:?? (NPObject *を返す場合)

NPN_GetValue:?? (NPObject *を返す場合)

NPN_SetValue:?? (NPObject *に設定されている場合)

NPN_GetProperty:?? (NPObject *を返す場合)

NPN_SetProperty:?? (NPObject *に設定されている場合)

NPN_RemoveProperty:??

NPN_Enumerate:??

NPN_Construct:??

別のこと:npapiはネストされたリリースを行いますか?(NPObject*のプロパティを持つNPObject*の場合、親を解放すると子のrefカウントが減少します)。

ありがとう。

4

2 に答える 2

4

コメントであなたの質問にうまく答える余地がないので、別の答えに入れます。

コードがNPObject関数(上記の関数の1つ)からNPObjectを取得するときはいつでも、それが終わったらそのNPObjectを解放する必要があります。(すぐに保存することも、オブジェクトが破棄されたときに解放することもできます)。同じことがNPVariantにも当てはまります。Invoke関数に渡された引数には当てはまりませんが、設定した戻り値は、完了するとブラウザによって解放されます。

NPN_GetValueを呼び出してそこからNPObjectを取得するときは、それも解放する必要があります。これは、ブラウザがNPP_GetValueを呼び出すと、完了するとNPObjectを解放することを意味します。ブラウザがNPObjectを取得するためにNPP_GetValueを呼び出すたびに新しいNPObjectを作成する場合は、NPN_RetainObjectを呼び出す必要はありません。NPAPIの例では、プラグインオブジェクトが削除されるまで削除されないように、NPObjectのコピーを保存していると想定しています。

ブラウザはNPObjectを取得するためにNPP_GetValueを呼び出すたびにReleaseを呼び出すため、返す前にrefcountがインクリメントされていることを確認する必要があります。保持する場合に2回呼び出す必要がない理由は、NPN_CreateObjectがオブジェクトを返す前に暗黙の保持を実行するためです。

私はここにもっと詳細な説明を書きました:

于 2009-12-24T19:56:12.847 に答える
3

まず、誤解を正すために: NPN_CreateObject は refCount を 0 ではなく 1 に設定します。次に、NPN_RetainObject を呼び出すと、refcount がインクリメントされ、NPN_ReleaseObject はそれをデクリメントします。ReleaseObject が refcount を 0 にデクリメントする場合、NPClass から deallocate 関数を呼び出して解放します (必要なクリーンアップを行った後に NPObject を削除する必要があります)。

参照: https://developer.mozilla.org/En/NPClass

それ以上に、他の NPClass 関数の一般的な経験則として、NPObject を NPVariant に入れるときはいつでも、NPN_RetainObject を呼び出す必要があります。これを覚えておくために、NPVariant (戻り値として渡されたものではなく、使用して完了したもの) を使い終わったら、NPN_ReleaseVariantValue を呼び出すことを覚えておいてください。文字列またはオブジェクトの場合は NPObject。

したがって、他のメソッドのいずれかから、NPObject を返す場合は、NPVariant に詰め込む前に NPN_RetainObject を呼び出す必要があります。また、NPObject のコピーを保存する場合は、それに対して NPN_RetainObject を呼び出し、保存が完了したら NPN_ReleaseObject を呼び出す必要があります。また、メインスレッド以外のスレッドから NPN_ メソッドを呼び出してはならないことにも注意してください。

それは役に立ちますか?

于 2009-12-24T17:48:57.927 に答える