سؤال

أنا مرتبك بشأن عدد المرجع في NPAPI. في الغالب ، لا أعرف الطريقة التي ستزيد عدد المرجع. هل يمكن لأي شخص أن يشرح بالتفصيل حول هذا؟ للراحة ، أدرجت وظائف NPN_* الأكثر شيوعًا هنا وفهمي الخاص:

npn_createBject: تعيين عدد المرجع إلى 0

NPN_RETAINOBJECT: INC COUNT

npn_releaseObject: عدد المرجع DEC

NPN_EVALTY: ؟؟ (في حالة إرجاع npobject*)

npn_getvalue: ؟؟ (في حالة إرجاع npobject*)

npn_setvalue: ؟؟ (في حالة تعيين على npobject*)

npn_getProperty: ؟؟ (في حالة إرجاع npobject*)

npn_setproperty: ؟؟ (في حالة تعيين على npobject*)

npn_removeProperty: ؟؟

npn_enumerate: ؟؟

npn_construct: ؟؟

شيء آخر: هل NPAPI DIS RESTERR EXERST؟ (في حالة NPOBject* مع خاصية NPOBject* ، سيؤدي الإفراج إلى تقليل عدد المرجع للطفل).

شكرًا.

هل كانت مفيدة؟

المحلول

لا يوجد مجال في التعليقات للإجابة على سؤالك في التعليق جيدًا ، لذلك سأضعه في إجابة أخرى.

في أي وقت يحصل الكود الخاص بك على npObject من دالة npObject (واحدة من تلك التي ذكرتها أعلاه) ، يجب أن تصدر هذا npObject عند الانتهاء من ذلك. (يمكن أن يكون ذلك على الفور ، أو يمكنك حفظه لفترة من الوقت وإطلاقه عند تدمير كائنك). وينطبق الشيء نفسه مع npvariant. نعم هو كذلك ليس صدق مع الوسيطات التي تم تمريرها في وظيفة Invoke الخاصة بك ، ولكن سيتم إطلاق قيمة الإرجاع التي تحددها من قبل المتصفح عند الانتهاء.

عند الاتصال بـ NPN_GetValue والحصول على npObject من هناك ، يجب أيضًا إصدار ذلك. هذا يعني أنه عندما يستدعي المتصفح npp_getValue ، فإنه سيصدر npObject عند الانتهاء. إذا كنت ترغب في إنشاء npObject جديد في كل مرة يقوم فيها المتصفح بالاتصال بـ NPP_GetValue للحصول على npObject الخاص بك ، فلا يتعين عليك الاتصال بـ npn_retainobject عليه ؛ الافتراض في مثال NPAPI هو أنك تقوم بحفظ نسخة من NPOBject حتى لا يتم حذفها حتى يتم حذف كائن البرنامج المساعد.

نظرًا لأن المستعرض سيتصل بالإصدار في كل مرة يقوم فيها باستدعاء NPP_GetValue للحصول على npObject الخاص بك ، فأنت بحاجة إلى التأكد من زيادة refcount قبل إعادته. السبب في أنك لا تضطر إلى الاتصال بها مرتين في حالة الاحتفاظ بها هو أن NPN_CreateBject يقوم بإبقاء ضمنيًا قبل إرجاع كائنك.

لقد كتبت تفسيرًا أكثر تفصيلاً هنا:

نصائح أخرى

أولاً ، لتصحيح المفهوم الخاطئ: NPN_CreateObject يعين refcount إلى 1 ، وليس إلى 0. ثم ، عند الاتصال بـ npn_retainobject ، فإنه يزيد من refcount ، وسيقوم NPN_ReleaseBject بتقليله. إذا انخفض relextObject إلى 0 ، فسيتم تحريره أيضًا عن طريق استدعاء وظيفة توزيع الصفوف من NPCLASS (والتي يجب حذف npObject بعد القيام بأي تنظيف مطلوب)

يرى: https://developer.mozilla.org/en/npclass

علاوة على ذلك ، هناك قاعدة عامة جيدة للإبهام لأي من وظائف NPClass الأخرى هي أنه في أي وقت تضع فيه npoBject في npvariant ، تحتاج إلى استدعاء NPN_RetainObject. لتذكر ذلك ، فقط تذكر أنه عندما تنتهي من npvariant (واحدة استخدمتها وفعلت معها ، لم يتم تمريرها كقيمة إرجاع) ، يمكنك الاتصال بـ NPN_ReleaseVariantValue ، والتي ستصدر بيانات NPSTRING إذا كانت سلسلة أو npObject إذا كان كائنًا.

لذلك من أي من الطرق الأخرى ، إذا كنت تعيد npObject ، فأنت بحاجة إلى استدعاء NPN_RETAINOBJECT قبل أن تضعه في npvariant. أيضًا ، إذا قمت بحفظ نسخة من NPOBject ، فيجب عليك الاتصال بـ NPN_RETAINOBJECT عليه و NPN_RELEASEOBJECT عند الانتهاء من حفظه. كما أنه يذكر أنه يجب ألا تتصل أبدًا بأي طريقة NPN_ من مؤشر ترابط آخر غير مؤشر الترابط الرئيسي.

هل هذا يساعد؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top