ما هو المسؤول عن إطلاق كائنات NSWindowController؟
-
06-07-2019 - |
سؤال
لنفترض أنني أعرض نافذة مثل هذا:
[[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 وبعض القفل.