سؤال

انا عالق!

أحاول إنشاء مربع حوار مشروط مخصص. أود أن يؤدي ذلك بشكل مشابه إلى 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] يعتني بالمتغيرات المحلية المشار إليها في الكتلة ، بحيث لا تختفي المتغيرات المحلية حتى بعد أن خرجت تدفق البرنامج من الطريقة التي قمت فيها بإجراء الكتلة.

تذكر الحقائق التالية:

  1. يلتقط مثيل الكتلة المتغيرات المحلية المشار إليها داخل الكتلة.
  2. ومع ذلك ، فإن مثيل الكتلة على المكدس. سوف تختفي حتى تحتفظ به ، عندما يخرج تدفق البرنامج من النطاق {...} حيث تقوم بإنشاء الكتلة.
  3. لذلك ، تحتاج إلى copy ليس فقط retain إذا كنت ترغب في استخدام البيانات بعد ذلك ، كما تفعل هنا. Copyجيه تلقائيا retainS جميع متغيرات الكائن المحلي المشار إليها من الكتلة.
  4. تحتاج إلى release بمجرد الانتهاء من ذلك. يتوافق مع الذاكرة للكتلة نفسها ، ويرسل release رسالة إلى متغيرات الكائن المحلي المشار إليها. إذا كنت تستخدم GC ، فلن تضطر إلى الاهتمام بهذا ، رغم ذلك.

لفهم المزيد من تفاصيل الكتلة ، وجدت المقالة هنا بقلم مايك آش مفيدًا جدًا.

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