نافذة مشروطة مخصصة مع معالج إتمام الكتلة
-
22-09-2019 - |
سؤال
انا عالق!
أحاول إنشاء مربع حوار مشروط مخصص. أود أن يؤدي ذلك بشكل مشابه إلى nssavepanel باستخدام كتلة كمعالج الانتهاء.
لقد قمت بنسخ المقتطفات المهمة التي أعتقد أنها مطلوبة.
@implementation ModalWindowController
- (void)makeKeyAndOrderFront:(id)sender
modalToWindow:(NSWindow*)window
sourceRect:(NSRect)rect
completionHandler:(void (^)(NSInteger result))handler {
_handler = [handler retain];
session = [NSApp beginModalSessionForWindow:[self window]];
[[NSApplication sharedApplication] runModalSession:session];
[[self window] makeKeyAndOrderFrontCentered:self expandingFromFrame:rect];
}
- (IBAction)okButtonPressed:(id)sender {
[[self window] orderOut:self];
_handler(NSOKButton);
[NSApp endModalSession:session];
}
@end
الآن يمكنني تسمية هذا باستخدام الرمز:
[self.modalWindowController makeKeyAndOrderFront:self
modalToWindow:[[self view] window]
sourceRect:sr
completionHandler:^(NSInteger result) {
NSLog(@"Inside Block");
if ( result == NSOKButton ) {
// do something interesting here
}
}];
NSLog(@"Errg");
ومع ذلك ، فإن كل شيء يسير على ما يرام ، بعد طريقة MakeKeyandorderfront: ModalTowIndow: Sourcerect: CompletionHandler: لقد أكملت أنه لا يحظر الخيط ، لذلك سيتم طباعة "ERRG" على الرغم من أن المستخدم لم يحدد "OK" أو "إلغاء". يتم عرض النافذة المشروطة في هذه المرحلة ، حيث ينقر المستخدم على موافق ثم يتم تنفيذ كتلة _Handler. ومع ذلك ، إذا كنت أحاول الوصول إلى المتغيرات المحلية في الكتلة ، وتعطل التطبيق حيث تم تنظيف كل شيء بالفعل.
ما هي أفضل طريقة لحظر الخيط الرئيسي من Makekeyandorderfront: ... الطريقة؟ هل هذا هو النهج الصحيح لتنفيذ معالج الانتهاء باستخدام الكتل؟
المحلول
خطك
_handler=[handler retain];
يجب ان يكون
_handler=[handler copy];
يجب أن يحل هذا مشكلتك ، وأن المتغيرات المحلية قد اختفت قبل استدعاء معالج الانتهاء.[handler copy]
يعتني بالمتغيرات المحلية المشار إليها في الكتلة ، بحيث لا تختفي المتغيرات المحلية حتى بعد أن خرجت تدفق البرنامج من الطريقة التي قمت فيها بإجراء الكتلة.
تذكر الحقائق التالية:
- يلتقط مثيل الكتلة المتغيرات المحلية المشار إليها داخل الكتلة.
- ومع ذلك ، فإن مثيل الكتلة على المكدس. سوف تختفي حتى تحتفظ به ، عندما يخرج تدفق البرنامج من النطاق
{...}
حيث تقوم بإنشاء الكتلة. - لذلك ، تحتاج إلى
copy
ليس فقطretain
إذا كنت ترغب في استخدام البيانات بعد ذلك ، كما تفعل هنا.Copy
جيه تلقائياretain
S جميع متغيرات الكائن المحلي المشار إليها من الكتلة. - تحتاج إلى
release
بمجرد الانتهاء من ذلك. يتوافق مع الذاكرة للكتلة نفسها ، ويرسلrelease
رسالة إلى متغيرات الكائن المحلي المشار إليها. إذا كنت تستخدم GC ، فلن تضطر إلى الاهتمام بهذا ، رغم ذلك.
لفهم المزيد من تفاصيل الكتلة ، وجدت المقالة هنا بقلم مايك آش مفيدًا جدًا.