سؤال

لنفترض أنني أعرض نافذة مثل هذا:

[[TBAddTaskWindowController new] showWindow:self];

أين من المفترض أن يتم إصدار كائن TBAddTaskWindowController؟هل الحل العام هو استدعاء [الإصدار الذاتي] في windowWillClose؟

لا يبدو من الصواب أن يكون لديك أي كائن آخر "يمتلك" النافذة، لأنه من المفترض أن يظل موجودًا حتى يقوم المستخدم بإغلاقه.

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

المحلول

ونفس التعليمات البرمجية التي مثيل وحدة تحكم نافذة عن طريق إرسال رسالة new إلى فئة، بنفس الطريقة كما لو أنها قد فعلت ذلك من قبل رسائل alloc وinit.

نصائح أخرى

نعم، هناك طريقة شائعة لتحرير وحدة التحكم في النافذة وهي:

- (void)windowWillClose:(NSNotification *)notification
{
    [self autorelease];
}

يجب أن تظل وحدة التحكم في النافذة موجودة فقط طالما أن النافذة موجودة، لذا فإن تحريرها تلقائيًا عند اختفاء النافذة أمر منطقي تمامًا.

تذكر إزالة أي مراقبين آخرين، وما إلى ذلك أيضًا.


[معلومات مضافة للعمل ضمن ARC]

بالنسبة لـ ARC، تحتاج إلى الاحتفاظ بمرجع قوي لعنصر التحكم في النافذة أثناء فتح النافذة، ثم إزالته عند إغلاق النافذة.
للقيام بذلك، قمت بإضافة فئة على النافذة التي يتم التحكم فيها بطريقتين:

  • pnl_addWindowController - يتم استدعاؤه بواسطة وحدة التحكم في النافذة عند فتح النافذة لأول مرة
  • pnl_removeWindowController - اتصل من windowWillClose

تحافظ الفئة على العالمية NSMutableSet من وحدات تحكم النافذة النشطة.الكود عادل في الأساس [gWindowControllers addObject:self] و [gWindowControllers removeAllObjects], ، مع بعض الإنشاء البطيء لـ NSMutableSet وبعض القفل.

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