سؤال

هذا هو غريب حقا ...

أقوم بتشغيل التطبيق الخاص بي، وبينما يتم فتحها وتشكل الآراء أحصل على:

Collection <CALayerArray: 0x124650> was mutated while being enumerated.

يمر تتبع التعليمات البرمجية ما يلي:

main
UIApplicationMain
-[UIApplication _run]
CFRunLoopRunInMode
CFRunLoopRunSpecific
_UIApplicationHandleEvent
-[UIApplication sendEvent:]
-[UIApplication handleEvent:withNewEvent:]
-[UIApplication _runWithURL:sourceBundleID:]
-[UIApplication _performInitilizationWithURL:sourceBundleID:]
-[AppDelegate applicationDidFinishLaunching:]
+[Controller initializeController] //This is my own function
    [window addSubview: pauseMenuController.view] //This is the last point of my code it goes through
-[UIView(Hierarchy) addSubview:]
-[UIView(Internal) _addSubview:positioned:relativeTo:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]
_NSFastEnumerationMutationHandler
objc_exception_throw

لقد قمت بتشغيل الكثير من اللعبة والكثير والكثير من المرات ولم أر هذا أبدا، ثم فجأة برزت. الشيء الغريب هو أنني لا أخلق أي مؤشرات ترابط أخرى (التي أعرفها) حتى بعد هذا الرمز يطلق عليه كل شيء. سيكون من الأسهل بالنسبة لي تصحيح هذا إذا كان شخص ما يمكن أن يعطيني بعض التفسير لما قد يتم تعديله أثناء الوصول إليه في Uiview. هل لديها ما يجب القيام به مع إضافة شيء للعرض أثناء إضافة شيء ما بالفعل، ربما؟ أيه أفكار؟

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

المحلول

انها ليست استثناء التزامن. تحدث استثناءات طفرة التعداد عندما يغير شيء ما (ربما داخل حلقة في نفس الخيط) مجموعة الصفيف / المجموعة / القاموس أن الحلقة تكرار.

نظرا لأن AddSubView: يقع على المكدس، أعتقد أن شيئا ما يحاول إزالة أحد فرعيات Uiview أثناء الإنشاء.

هل تتجاوز أي طرق قد يتم تشغيلها؟ مثل addsubview أو ربما layoutsubviews؟ إذا كان أي من هذه عمليات إزالتها فرعية، فسيؤدي ذلك إلى المشكلة.

نصائح أخرى

هل من الممكن أن يكون لديك طريقة فرعية حيث قمت بتعيين المندوب ليكون الرأي؟ هذا من شأنه أن يسبب ذلك عادة الرأي لإعادة التوصل إلى بلا حدود (حسنا، حتى تصل إلى حد المكدس) عند الاتصال _makeSubtreePerformSelector:withObject:withObject:copySublayers:, ، لكنني أفترض أنه من الممكن أن يكون كل ما يحاول القيام به هنا ينطوي على طفرة.

السبب في ذلك هو أنه نظرا لأن Uiview يفترض أنه إذا كان مندوب Calayer هو Uiview، فإن Calayer ينتمي إلى Uiview و Uiview جزء من التسلسل الهرمي. ومع ذلك، إذا قمت بإنشاء Calayer الخاص بك وتعيين المفوض ليكون Uiview، فسوف ينتهي Uiview في الدعوة لنفسها كجزء من العودية.

من الوثائق:

يعد التعداد "آمنا" - يحتوي العيار على حارس طفرة حتى إذا حاولت تعديل المجموعة أثناء التعداد، يتم رفع استثناء.

في الأساس، هذا يعني أنك غير مسموح لك بإضافة / إزالة الكائنات إلى مجموعة (قل صفيف) أثناء تعدادها باستخدام التعداد السريع الذي تم تقديمه في الهدف-C 2.0. لأن القيام بذلك سوف تجعل حارس الطفرة غير صالح.

في حالتك، ترتبط المجموعة بعرض التسلسل الهرمي. إذا كنت ترغب في إضافة و / أو إزالة المشاهدات إلى هذه المجموعة الخاصة، فلا تستخدم التعداد السريع.

لقد رأيت أن هذا يحدث داخل Calayers عند محاولة مسح خاصية أثناء طريقة Calayer's -DealLoc، مما يؤدي فقط إلى تغيير هذا العقار عن غير قصد على خاصية مرئية للطبقة. يمكنك التحقق ومعرفة ما إذا كنت تفعل شيئا ما يغير خصائص إحدى وجهات نظرك أثناء الرأي نفسه.

ضربت على نفس الخطأ. كنت تمثل التسلسل الهرمي الرأي في مؤشر ترابط غير رئيسي. تأكد من إجراء جميع التعديلات على الرأي على الخيط الرئيسي.

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