عد المراجع التلقائي
تُعدّ خاصية عدّ المراجع التلقائي ( ARC ) ميزةً لإدارة الذاكرة في مُصرّف Clang، حيث تُوفّر عدّ المراجع التلقائي للغتي البرمجة Objective-C و Swift . أثناء عملية التجميع، تُدرج هذه الخاصية رسائل في كود الكائن [ 1 ] [ 2 ] ، والتي تزيد أو تُنقص عدد المراجع أثناء التشغيل، وتُعلّم الكائنات المراد تحريرها عندما يصل عدد المراجع إليها إلى الصفر.retainrelease
يختلف نظام إدارة الذاكرة التلقائي (ARC) عن نظام جمع البيانات المهملة القائم على التتبع في أنه لا توجد عملية خلفية تقوم بتحرير الكائنات بشكل غير متزامن أثناء التشغيل. [ 3 ] على عكس نظام جمع البيانات المهملة القائم على التتبع، لا يتعامل نظام إدارة الذاكرة التلقائي مع دورات المراجع تلقائيًا. هذا يعني أنه طالما توجد مراجع "قوية" لكائن ما، فلن يتم تحريره. وبالتالي، يمكن أن تؤدي المراجع المتبادلة القوية إلى حالات جمود وتسريبات للذاكرة . يقع على عاتق المطور مسؤولية كسر هذه الدورات باستخدام مراجع ضعيفة . [ 4 ]
تُطبّق شركة آبل تقنية إدارة الذاكرة التلقائية (ARC) في أنظمة تشغيلها، مثل macOS ( OS X ) و iOS . يتوفر دعم محدود (ARCLite) [ 5 ] منذ إصداري Mac OS X Snow Leopard و iOS 4 ، مع دعم كامل لاحق في Mac OS X Lion و iOS 5. [ 6 ] أُعلن عن إيقاف استخدام تجميع البيانات المهملة في OS X Mountain Lion لصالح ARC، وتمت إزالته من مكتبة وقت تشغيل Objective-C في macOS Sierra . [ 7 ] [ 8 ]
أوبجكتيف سي
يتم تطبيق القواعد التالية بواسطة المترجم عند تشغيل ARC:
retainلا يمكن إرسالreleaseهذهretainCountالرسائل إلى الكائنات. بدلاً من ذلك ، يقوم المترجم بإدراج هذه الرسائل تلقائيًا في وقت الترجمة، بما في ذلك عند تجاوزها. [ 9 ]autoreleasedealloc[super dealloc]dealloc// بدون ARC - ( void ) dealloc { [[ NSNotificationCenter defaultCenter ] removeObserver : self ]; [ super dealloc ]; }// مع ARC - ( void ) dealloc { [[ NSNotificationCenter defaultCenter ] removeObserver : self ]; // يتم استدعاء [super dealloc] تلقائيًا }
- لا يمكن للبرامج إجراء تحويل مباشر بين
idأنواع البيانات المختلفةvoid *. [ 9 ] يشمل ذلك التحويل بين كائنات Foundation وكائنات Core Foundation. يجب على البرامج استخدام تحويلات خاصة، أو استدعاءات لوظائف خاصة، لتزويد المترجم بمعلومات إضافية حول دورة حياة الكائن.// بدون ARC - ( NSString * ) giveMeAString { CFStringRef myString = [ self someMethodThatCreatesACFString ]; NSString * newString = ( NSString * ) myString ; return [ newString autorelease ]; }// باستخدام ARC - ( NSString * ) giveMeAString { CFStringRef myString = [ self someMethodThatCreatesACFString ]; // عدد النسخ المحفوظة هو 1 NSString * newString = ( __bridge_transfer NSString * ) myString ; // تم نقل الملكية الآن إلى ARC return newString ; }
- يمكن استخدام مجمع التحرير التلقائي لتخصيص الكائنات مؤقتًا والاحتفاظ بها في الذاكرة حتى يتم "تفريغ" المجمع. بدون تقنية ARC،
NSAutoreleasePoolيمكن إنشاء كائن لهذا الغرض. تستخدم تقنية ARC@autoreleasepoolالكتل بدلاً من ذلك، والتي تغلف عملية تخصيص الكائنات المؤقتة وتحررها عند الوصول إلى نهاية الكتلة. [ 9 ]// بدون ARC - ( void ) loopThroughArray: ( NSArray * ) array { for ( id object in array ) { NSAutoreleasePool * pool = [[ NSAutoreleasePool alloc ] init ]; // إنشاء العديد من الكائنات المؤقتة [ pool drain ]; } }// مع ARC - ( void ) loopThroughArray: ( NSArray * ) array { for ( id object in array ) { @autoreleasepool { // إنشاء العديد من الكائنات المؤقتة } } }
- لا يمكن للبرامج استدعاء الدوال
NSAllocateObjectوNSDeallocateObject[ 9 ] - لا يمكن للبرامج استخدام مؤشرات الكائنات في هياكل لغة C (
structs) [ 9 ] - لا يمكن للبرامج استخدام مناطق الذاكرة (
NSZone) [ 9 ] - للتعاون بشكل صحيح مع التعليمات البرمجية غير المتوافقة مع ARC، يجب ألا تستخدم البرامج أي طريقة أو خاصية معلنة (إلا إذا تم اختيار دالة جلب مختلفة بشكل صريح) تبدأ بـ
new. [ 9 ]
إقرارات الملكية
يقدم ARC بعض سمات تعريف الخصائص الجديدة، والتي يحل بعضها محل السمات القديمة.
| بدون ARC | مع ARC | باستخدام ARCLite [ ملاحظة 1 ] |
|---|---|---|
retain | strong | |
assign(لأنواع الكائنات) | weak | unsafe_unretained |
copy | ||
- ↑ ARCLite هو ARC ولكن بدون تصفير المراجع الضعيفة (يستخدم عند النشر في بيئة تشغيل أقل قدرة مما يتطلبه ARC).
تصفير المراجع الضعيفة
تصفير المراجع الضعيفة ميزة في نظام إدارة الذاكرة التلقائية (ARC) في لغة Objective-C، تعمل على مسح (تعيين قيمة nil) المتغيرات المحلية ذات المراجع الضعيفة، ومتغيرات النسخ، والخصائص المُعلنة، مباشرةً قبل بدء تحرير الذاكرة للكائن المُشار إليه. يضمن هذا أن المؤشر يشير إما إلى كائن صالح أو إلى قيمة فارغة nil، ويتجنب المؤشرات المعلقة . قبل إضافة هذه الميزة، كانت "المراجع الضعيفة" تُشير إلى المراجع التي لم تكن تحتفظ بالذاكرة، ولكن لم يتم تعيين قيمتها إلى nilقيمة فارغة عند تحرير الذاكرة للكائن الذي تُشير إليه (وهو ما يُعادل ` unsafe_unretainedenable` في نظام إدارة الذاكرة التلقائية)، مما قد يؤدي إلى مؤشر معلق. كان على المبرمج عادةً التأكد من تعيين جميع المراجع الضعيفة المُحتملة للكائن إلى قيمة فارغة يدويًا عند تحرير الذاكرة. يُغني تصفير المراجع الضعيفة عن هذه الحاجة.
يتم الإشارة إلى تصفير المراجع الضعيفة باستخدام سمة الخاصية المعلنةweak أو باستخدام سمة المتغير __weak.
لا تتوفر ميزة تصفير المراجع الضعيفة إلا في نظامي التشغيل Mac OS X Lion (10.7) والإصدارات الأحدث، وiOS 5 والإصدارات الأحدث، لأنها تتطلب دعمًا إضافيًا من بيئة تشغيل Objective-C. مع ذلك، لا تدعم بعض فئات نظام التشغيل OS X المراجع الضعيفة حاليًا. [ 9 ] لا يمكن للتعليمات البرمجية التي تستخدم ARC ولكنها تحتاج إلى دعم إصدارات أقدم من نظام التشغيل المذكورة أعلاه استخدام ميزة تصفير المراجع الضعيفة، وبالتالي يجب عليها استخدام unsafe_unretainedالمراجع الضعيفة. توجد مكتبة خارجية تُسمى PLWeakCompatibility.وهذا يسمح باستخدام المراجع الضعيفة التي تقوم بتصفيرها حتى في إصدارات نظام التشغيل القديمة هذه.
التحويل إلى
يوفر Xcode 4.2 والإصدارات الأحدث طريقة لتحويل الكود إلى ARC. [ 10 ] بدءًا من Xcode 4.5، يمكن الوصول إلى هذه الطريقة باختيار تحرير > إعادة هيكلة > تحويل إلى Objective-C ARC... على الرغم من أن Xcode يقوم بتحويل معظم الأكواد تلقائيًا، إلا أنه قد يلزم تحويل بعضها يدويًا. سيُعلم Xcode المطور عند ظهور حالات استخدام أكثر تعقيدًا، مثل تعريف متغير داخل مجموعة تحرير تلقائي واستخدامه خارجها، أو عند الحاجة إلى ربط كائنين دون الحاجة إلى تحويلات خاصة.
سويفت
في لغة Swift، تُعتبر المراجع إلى الكائنات قوية، ما لم يتم تعريفها بشكل صريح weakأو ضمني unowned. تتطلب Swift معالجة صريحة للقيمة nil مع النوع الاختياري (Optional): وهو نوع قيمة يمكن أن يحتوي على قيمة أو يكون nil. يجب التعامل مع النوع الاختياري عن طريق "فك تغليفه" باستخدام عبارة شرطية ، مما يسمح بالاستخدام الآمن للقيمة، إن وجدت. في المقابل، أي نوع غير اختياري (non-Optional) سيكون له دائمًا قيمة ولا يمكن أن يكون nil.
var myString : String // لا يمكن أن يكون إلا سلسلة نصية var myOtherString : String ? // يمكن أن يكون سلسلة نصية أو قيمة فارغةif let myString = myOtherString { // فك التغليف الاختياري print ( myString ) // طباعة السلسلة، إن وجدت }وبناءً على ذلك، يمكن أن يكون المرجع القوي لكائن ما من النوع الاختياري أو غير الاختياري (الاختيارية وقوة المرجع مفهومان مختلفان، وإن كانا مرتبطين). المرجع الضعيف يكون دائمًا من النوع الاختياري، حيث يمكن تحرير الكائن وتعيين المرجع تلقائيًا إلى قيمة فارغة. أما المراجع غير المملوكة فهي تشبه المراجع الضعيفة، ولكن لا يتم تعيينها إلى قيمة فارغة تلقائيًا بواسطة إدارة الذاكرة التلقائية (ARC). يمكن أن تكون هذه المراجع إما اختيارية أو غير اختيارية. من المتوقع أن يكون للمرجع غير المملوك قيمة دائمًا، لذا فإن الوصول إلى قيمة مرجع غير مملوك بعد تحرير الكائن المشار إليه سيؤدي إلى خطأ وقت التشغيل. [ 11 ]
var strongReference : MyClass // مرجع قوي غير اختياري، لا يمكن أن يكون فارغًا var strongOptionalReference : MyClass ? // مرجع قوي اختياري، يمكن أن يكون فارغًا (يدويًا) weak var weakReference : MyClass ? // مرجع ضعيف، اختياري دائمًا، يمكن أن يكون فارغًا (تلقائيًا أو يدويًا) unowned var unownedReference : MyClass // مرجع غير اختياري غير مملوك، لا يمكن أن يكون فارغًاتختلف لغة Swift عن لغة Objective-C في استخدامها وتشجيعها لأنواع القيم بدلاً من أنواع المراجع . فمعظم الأنواع في مكتبة Swift القياسية هي أنواع قيم، ويتم نسخها بالقيمة، بينما تُعدّ الأصناف والإغلاقات أنواع مراجع، ويتم تمريرها بالمرجع. ولأن أنواع القيم تُنسخ عند تمريرها، يتم تحريرها تلقائيًا عند خروج البرنامج من النطاق الذي يحتويها. [ 11 ] [ 12 ]
انظر أيضاً
مراجع
- ↑ سيراكوزا، جون (20 يوليو 2011). "نظام التشغيل ماك أو إس إكس 10.7 ليون: مراجعة آرس تكنيكا" . آرس تكنيكا . آرس تكنيكا. في قسم "العد المرجعي التلقائي" . تم الاطلاع عليه في 17 نوفمبر 2016 .
- ↑ كوتشان ، ستيفن ج. (2011). البرمجة بلغة أوبجكتيف-سي ( الطبعة الرابعة). بوسطن، ماساتشوستس: أديسون-ويسلي. ص 408. ISBN 978-0321811905.
- ↑ هوفمان، كيفن (2012). سامز : تعلم بنفسك تطوير تطبيقات نظام التشغيل ماك أو إس إكس ليون في 24 ساعة . إنديانابوليس، إنديانا: سامز. ص 73. ISBN 9780672335815.
- ↑ "عام" . عدّ المراجع التلقائي . LLVM.org . تم الاطلاع عليه بتاريخ 15 أغسطس 2012 .
- ↑ "مؤشر توافر ميزات Objective-C" . شركة Apple . تم الاطلاع عليه بتاريخ 14-10-2013 .
- ↑ ساكاموتو، كازوكي (2012). إدارة تعدد الخيوط والذاكرة الاحترافية لنظامي التشغيل iOS وOS X باستخدام ARC وGrand Central Dispatch وBlocks . دار نشر Apress. عدد الصفحات: 12. رقم ISBN 978-1430241164.
- ↑ سيراكوزا، جون (25 يوليو 2012). "نظام التشغيل OS X 10.8 ماونتن ليون: مراجعة آرس تكنيكا" . آرس تكنيكا . في قسم "تحسينات Objective-C" . تم الاطلاع عليه في 17 نوفمبر 2016 .
- ↑ "ملاحظات إصدار Xcode 8" . مطورو Apple . 27 أكتوبر 2016. مؤرشف من الأصل في 19 مارس 2017. تم الاطلاع عليه في 19 مارس 2017 .
- 1 2 3 4 5 6 7 8 "الانتقال إلى ملاحظات إصدار ARC" . تم الاطلاع عليه بتاريخ 14 سبتمبر 2012 .
- ↑ "ما الجديد في Xcode 4.2 - عدّ المراجع التلقائي" . شركة آبل. مؤرشف من الأصل في 20 أغسطس 2012. تم الاطلاع عليه في 3 أكتوبر 2012 .
- 1 2 "العد المرجعي التلقائي - لغة برمجة سويفت (سويفت 5.7)" . docs.swift.org . تم الاطلاع عليه بتاريخ 2022-11-05 .
- ↑ "أنواع القيم والمراجع" . مطورو أبل . 15 أغسطس 2014. تم الاطلاع عليه في 17 نوفمبر 2016 .
روابط خارجية
- الانتقال إلى ARC - مكتبة مطوري iOS
- "العد المرجعي التلقائي" في لغة البرمجة سويفت
- أوبجكتيف سي
- إدارة الذاكرة
