سؤال

أفهم أنه يمكننا استخدام المراجع الترابطية لاستدعاء سلوك يشبه ivar في الفئات.ولكن ما هو السبب المحدد وراء عدم القدرة على الإعلان عن ivars جديدة في الفئات؟

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

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

المحلول

فكر في أشكال Objective-C مثل بنية C القديمة البسيطة.عند إنشاء مثيل لفئة ما، يتم إنشاء كتلة من الذاكرة كبيرة بما يكفي لاستيعاب تلك البنية.

لنفترض أن لديك NSString.يتم تجميع الكثير والكثير من التعليمات البرمجية الموجودة للاستخدام NSString.تم بناء الكثير من هذا الكود في المكتبات والأطر.تم إنشاء هذا الكود المترجم مع العلم أن ivars لـ NSString تأخذ عدد X من البايتات وتكون في بعض الإزاحات المحددة داخل تلك الذاكرة.

الآن في مشروعك الصغير لنفترض أنك قمت بإنشاء فئة على NSString وتريد إضافة ivar.من الناحية النظرية، فإن أي كود في مشروعك يتضمن ملف الرأس الخاص بالفئة سيعرف أن حجم هذا "الجديد" NSString (فئة زائد) تأخذ X + Y بايت.هذا يشبه إلى حد كبير فئة فرعية.يمكن لهذا الكود المترجم حديثًا التعامل بشكل صحيح مع ivar (s) الإضافية.

لكن كل التعليمات البرمجية المترجمة مسبقًا، والمكتبات والأطر، لن يكون لديها أي معرفة بالإيفار الإضافية.متى NSString يتم إنشاء المثيلات هناك، وتكون الذاكرة X بايت فقط، وليس X + Y بايت.تحدث الفوضى عندما يحصل رمز التطبيق الخاص بك على إشارة إلى تلك القطعة الأصغر من الذاكرة ويحاول الوصول إلى وحدات البايت الخاصة بالفئة ivar.سوف تزدهر الأمور.

مع فئة فرعية قديمة بسيطة، تعمل الأمور لأن أي كود يمكنه استخدام ivars للفئة الفرعية يعرف عن ivars للفئة الفرعية.ولكن مع الفئة، فإن الكود الموجود مسبقًا ليس لديه معرفة بالإضافات ولن يقوم بإنشاء مساحة لها بشكل صحيح.

أفترض أنني يجب أن أحدد أن كل ما سبق هو إلى حد كبير تخمين مدروس.قد أكون مخطئا تماما.يبدو معقولا على الأقل.:)

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