أوبجكتيف سي
لغة Objective-C هي لغة برمجة عالية المستوى ، متعددة الأغراض ، وموجهة للكائنات، تُضيف ميزة تمرير الرسائل (المراسلة) على غرار لغة Smalltalk إلى لغة البرمجة C. [ 3 ] طُوّرت في الأصل على يد براد كوكس وتوم لوف في أوائل ثمانينيات القرن الماضي، واختارتها شركة NeXT لنظام التشغيل NeXTSTEP . ونظرًا لأن نظام macOS من Apple مُشتق مباشرةً من NeXTSTEP، [ 4 ] فقد كانت Objective-C اللغة القياسية التي استخدمتها ودعمتها وروّجت لها Apple لتطوير تطبيقات macOS و iOS (عبر واجهات برمجة التطبيقات ( APIs ) الخاصة بهما ، Cocoa و Cocoa Touch ) منذ عام 1997، عندما استحوذت Apple على NeXT، وحتى ظهور لغة Swift في عام 2014. [ 5 ]
يمكن أيضًا تجميع برامج Objective-C المطورة لأنظمة التشغيل غير التابعة لشركة Apple أو التي لا تعتمد على واجهات برمجة تطبيقات Apple لأي منصة مدعومة من GNU أو GNU Compiler Collection (GCC) أو LLVM / Clang .
عادةً ما تحمل ملفات برامج "المراسلة/التنفيذ" في لغة Objective-C .mامتدادات أسماء ملفات، بينما تحمل ملفات "الرأس/الواجهة" في Objective-C .hامتدادات مماثلة لملفات رأس لغة C. أما ملفات Objective-C++ فتُعرف بامتداد .mmاسم ملف.
تاريخ
تم إنشاء لغة البرمجة Objective-C بشكل أساسي بواسطة براد كوكس وتوم لوف في أوائل الثمانينيات في شركتهما Productivity Products International (PPI) . [ 6 ] [ 7 ]
قبل تأسيس شركتهما، تعرّف كلاهما على لغة سمول توك أثناء عملهما في مركز تكنولوجيا البرمجة التابع لشركة آي تي تي عام ١٩٨١. ويعود تاريخ أقدم أعمالهما على لغة أوبجكتيف-سي إلى تلك الفترة تقريبًا. [ ٨ ] كان كوكس مفتونًا بمشاكل إعادة الاستخدام الحقيقية في تصميم البرمجيات وبرمجتها. وأدرك أن لغة مثل سمول توك ستكون ذات قيمة كبيرة في بناء بيئات تطوير لمطوري الأنظمة في آي تي تي. ومع ذلك، أدرك هو وتوم لوف أيضًا أن التوافق مع الإصدارات السابقة من لغة سي كان بالغ الأهمية في بيئة هندسة الاتصالات في آي تي تي. [ ٩ ]
بدأ كوكس بكتابة معالج مسبق للغة C لإضافة بعض إمكانيات لغة Smalltalk . وسرعان ما أنجز تطبيقًا عمليًا لامتداد كائني التوجه للغة C ، أطلق عليه اسم Object-Oriented Pre-Compiler (OOPC). [ 10 ] في عام 1982، عُيّن لوف من قبل شركة شلمبرجير للأبحاث، وأتيحت له فرصة الحصول على أول نسخة تجارية من Smalltalk-80، مما أثر بشكل كبير على تطوير مشروعهم الرائد. [ 11 ] ولإثبات إمكانية تحقيق تقدم حقيقي، أوضح كوكس أن جعل مكونات البرمجيات قابلة للتبديل لا يتطلب سوى بعض التغييرات العملية على الأدوات الحالية. تحديدًا، كان من الضروري أن تدعم هذه الأدوات الكائنات بطريقة مرنة، وأن تأتي مزودة بمجموعة مكتبات قابلة للاستخدام ، وأن تسمح بتجميع الكود (وأي موارد يحتاجها الكود) في تنسيق واحد متعدد المنصات .
أسس لوف وكوكس شركة PPI لتسويق منتجهما. ولتجنب النزاعات القانونية مع أصحاب عمله السابقين، أعاد كوكس برمجة مُترجمه للغة، التي أُعيد تسميتها إلى "Objective-C". تكوّن خط إنتاج الشركة الرئيسي من هذا المُترجم، بالإضافة إلى مكتبات الفئات المُصممة للاستخدام معه. [ 11 ] في عام 1986، نشر كوكس الوصف الرئيسي للغة Objective-C بصيغتها الأصلية في كتاب " البرمجة الكائنية التوجه: منهج تطوري" . ورغم حرصه على توضيح أن مسألة إعادة الاستخدام تتجاوز ما تُقدمه Objective-C، إلا أن اللغة كانت تُقارن غالبًا بميزات لغات أخرى.
الانتشار من خلال NeXT
في عام ١٩٨٨، حصلت شركة NeXT على ترخيص لغة Objective-C من شركة StepStone (الاسم الجديد لشركة PPI، المالكة لعلامة Objective-C التجارية)، وقامت بتوسيع مُصرّف GCC لدعم هذه اللغة. طوّرت NeXT مكتبتي Application Kit (AppKit) و Foundation Kit اللتين استندت إليهما واجهة المستخدم NeXTSTEP وأداة Interface Builder. ورغم أن محطات عمل NeXT لم تُحقق نجاحًا كبيرًا في السوق، إلا أن أدواتها لاقت استحسانًا واسعًا في هذا المجال. توقفت NeXT عن إنتاج الأجهزة وركزت على أدوات البرمجيات، حيث سوّقت NeXTSTEP (وOPENSTEP) كمنصة للبرمجة المُخصصة.
للتحايل على شروط رخصة جنو العمومية (GPL) ، كانت شركة NeXT تعتزم في الأصل شحن واجهة Objective-C الأمامية بشكل منفصل، مما يسمح للمستخدم بربطها مع GCC لإنتاج ملف تنفيذي للمترجم. ورغم موافقة ريتشارد إم. ستالمان المبدئية على هذه الخطة، إلا أنها رُفضت بعد استشارة ستالمان لمحامي جنو، ووافقت NeXT على جعل Objective-C جزءًا من GCC. [ 12 ]
قاد ستيف ناروف، الذي انضم إلى شركة NeXT قادمًا من شركة StepStone، العمل على توسيع مجموعة مُترجمات GNU (GCC). أُتيحت تعديلات المُترجم وفقًا لشروط رخصة جنو العمومية (GPL)، لكن مكتبات وقت التشغيل لم تُتح، مما جعل المساهمة مفتوحة المصدر غير قابلة للاستخدام من قِبل عامة الناس. دفع هذا الأمر جهات أخرى إلى تطوير مكتبات وقت تشغيل مماثلة بموجب تراخيص مفتوحة المصدر. لاحقًا، كان ستيف ناروف أيضًا مساهمًا رئيسيًا في العمل لدى شركة Apple لبناء واجهة Objective-C الأمامية لـ Clang . [ 13 ]
بدأ مشروع جنو العمل على تطبيقه المجاني لبرمجيات كوكوا ، والذي أطلق عليه اسم جنو ستيب ، استنادًا إلى معيار أوبن ستيب . [ 14 ] كتب دينيس غلاتينغ أول بيئة تشغيل جنو أوبجكتيف-سي في عام 1992. أما بيئة تشغيل جنو أوبجكتيف-سي الحالية، المستخدمة منذ عام 1993، فهي تلك التي طورها كريستن كراب ثورب عندما كان طالبًا جامعيًا في الدنمارك . [ 15 ] عمل ثورب أيضًا في شركة نيكست من عام 1993 إلى عام 1996. [ 16 ]
تطوير تطبيقات أبل ولغة سويفت
بعد استحواذها على شركة NeXT عام ١٩٩٦، استخدمت شركة Apple Computer برنامج OpenStep في نظام تشغيلها الجديد آنذاك، Mac OS X. وشمل ذلك لغة Objective-C، وأداة تطوير البرامج Project Builder من NeXT المبنية على Objective-C ، وأداة تصميم واجهات المستخدم Interface Builder . وقد دُمجت كلتا الأداتين لاحقًا في تطبيق واحد هو Xcode . وتعتمد معظم واجهة برمجة تطبيقات Cocoa الحالية من Apple على كائنات واجهة OpenStep، وهي بيئة Objective-C الأكثر استخدامًا في التطوير النشط.
في مؤتمر المطورين العالمي (WWDC) 2014، قدمت شركة أبل لغة جديدة، وهي Swift ، والتي تم وصفها بأنها "Objective-C بدون C". [ 17 ]
بناء الجملة
لغة Objective-C هي طبقة رقيقة فوق لغة C ، وهي " مجموعة شاملة صارمة " للغة C، مما يعني أنه من الممكن ترجمة أي برنامج مكتوب بلغة C باستخدام مترجم Objective-C، وإدراج شيفرة مكتوبة بلغة C بحرية داخل فئة Objective-C. [ 18 ] [ 19 ] [ 20 ] [ 21 ]
تستمد لغة Objective-C تركيبها النحوي للكائنات من لغة Smalltalk . جميع تركيب العمليات غير الموجهة للكائنات (بما في ذلك المتغيرات الأولية، والمعالجة المسبقة، والتعبيرات، وتصريحات الدوال، واستدعاءات الدوال) مطابق لتركيب لغة C، بينما تركيب الميزات الموجهة للكائنات هو تطبيق لأسلوب مراسلة Smalltalk.
رسائل
يعتمد نموذج البرمجة الكائنية في لغة Objective-C على تمرير الرسائل إلى نسخ الكائنات. في Objective-C، لا يتم استدعاء دالة ، بل يتم إرسال رسالة . وهذا يختلف عن نموذج البرمجة Simula المستخدم في لغة C++ . يكمن الفرق بين هذين المفهومين في كيفية تنفيذ الكود المشار إليه باسم الدالة أو الرسالة. في لغة Simula، يرتبط اسم الدالة - في معظم الحالات - بجزء من الكود في الفئة المستهدفة بواسطة المُصرّف. أما في Smalltalk وObjective-C، فيتم تحديد هدف الرسالة أثناء التشغيل، حيث يقوم الكائن المُستقبِل نفسه بتفسير الرسالة. يتم تحديد الدالة بواسطة مُحدِّد فريد (selector ) SEL- وهو مُعرِّف فريد لكل اسم رسالة، وغالبًا ما يكون سلسلة نصية تنتهي بـ s تُمثِّل اسمها - ويتم تحويلها إلى مؤشر دالة C يُنفِّذها . [ 22 ] نتيجةً لذلك، لا يحتوي نظام تمرير الرسائل على فحص للأنواع. لا يُضمن أن يستجيب الكائن الذي تُوجه إليه الرسالة - أي المُستقبِل - للرسالة، وإذا لم يستجب، فإنه يُثير استثناءً. [ 23 ]NULIMP
يتطلب إرسال الرسالة methodإلى الكائن الذي يشير إليه المؤشر كتابة الكود التالي بلغة C++ :obj
obj -> method ( argument );في لغة Objective-C، يُكتب هذا على النحو التالي:
[ obj method : argument ];يُترجم المُصرّف استدعاء "method" إلى objc_msgSend(id self, SEL op, ...)مجموعة دوال وقت التشغيل. [ 24 ] وتتعامل تطبيقات مختلفة مع الإضافات الحديثة مثل super. [ 25 ] في عائلات GNU، تُسمى هذه الدالة objc_msg_sendv، ولكن تم إهمالها لصالح نظام بحث حديث ضمن objc_msg_lookup. [ 26 ]
لكل من أسلوبي البرمجة نقاط قوة وضعف متعددة. تسمح البرمجة كائنية التوجه في لغة سيمولا ( C++ ) بالوراثة المتعددة والتنفيذ الأسرع باستخدام الربط في وقت الترجمة كلما أمكن، لكنها لا تدعم الربط الديناميكي افتراضيًا. كما أنها تُلزم جميع الدوال بوجود تطبيق مطابق لها ما لم تكن مجردة . أما البرمجة بأسلوب سمول توك، كما هو مستخدم في أوبجكتيف-سي، فتسمح بترك الرسائل دون تطبيق، حيث يتم تحديد تطبيق الدالة في وقت التشغيل. على سبيل المثال، يمكن إرسال رسالة إلى مجموعة من الكائنات، والتي يُتوقع أن يستجيب بعضها فقط، دون خشية حدوث أخطاء في وقت التشغيل. كما أن تمرير الرسائل لا يتطلب تعريف الكائن في وقت الترجمة . مع ذلك، لا يزال التطبيق مطلوبًا لاستدعاء الدالة في الكائن المشتق. (انظر قسم الكتابة الديناميكية أدناه لمزيد من مزايا الربط الديناميكي (المتأخر)).
الواجهات والتطبيقات
تتطلب لغة Objective-C أن تكون واجهة وتنفيذ الصنف في كتل برمجية مُعلنة بشكل منفصل. جرت العادة أن يضع المطورون الواجهة في ملف رأس، والتنفيذ في ملف برمجي. تشبه ملفات الرأس، التي عادةً ما يكون لاحقتها .h، ملفات رأس لغة C، بينما قد تكون ملفات التنفيذ (الأساليب)، التي عادةً ما يكون لاحقتها .m، مشابهة جدًا لملفات برمجية لغة C.
واجهة المستخدم
وهذا يشبه تعريفات الفئات المستخدمة في لغات البرمجة الكائنية الأخرى، مثل C++ أو Python.
عادةً ما تُعرَّف واجهة الصنف في ملف رأس. ومن المتعارف عليه تسمية ملف الرأس باسم الصنف، على سبيل المثال، Ball.hسيحتوي على واجهة الصنف Ball.
يأخذ تعريف الواجهة الشكل التالي:
@interface ClassName : SuperclassName { // متغيرات النسخة } + classMethod1 ; + ( return_type ) classMethod2 ; + ( return_type ) classMethod3: ( param1_type ) param1_varName ;- ( return_type ) مثيلMethod1With1Parameter: ( param1_type ) param1_varName ؛ - ( return_type ) مثيل Method2With2Parameters: ( param1_type ) param1_varName param2_callName :( param2_type ) param2_varName ; @نهايةفي المثال أعلاه، تشير علامات الجمع إلى توابع الفئة ، أي التوابع التي يمكن استدعاؤها على الفئة نفسها (وليس على نسخة منها)، بينما تشير علامات الطرح إلى توابع النسخة ، التي لا يمكن استدعاؤها إلا على نسخة محددة من الفئة. كما لا يمكن لتوابع الفئة الوصول إلى متغيرات النسخة .
الكود أعلاه يعادل تقريبًا واجهة C++ التالية :
class ClassName : public SuperclassName { protected : // متغيرات النسخةعام : // دوال الفئة (الثابتة) static void * classMethod1 (); static return_type classMethod2 (); static return_type classMethod3 ( param1_type param1_varName );// دوال المثيل (العضو) return_type instanceMethod1With1Parameter ( param1_type param1_varName ); return_type instanceMethod2With2Parameters ( param1_type param1_varName , param2_type param2_varName = default ); };لاحظ أن هذا instanceMethod2With2Parameters:param2_callName:يوضح التداخل بين أجزاء المحدد مع تعبيرات الوسائط، والتي لا يوجد لها مكافئ مباشر في لغة C/C++.
يمكن أن تكون أنواع الإرجاع أي نوع قياسي في لغة C ، أو مؤشرًا إلى كائن عام في Objective-C، أو مؤشرًا إلى نوع كائن محدد مثل NSArray * أو NSImage * أو NSString *، أو مؤشرًا إلى الفئة التي ينتمي إليها الأسلوب (instancetype). نوع الإرجاع الافتراضي هو النوع العام في Objective-C id.
تبدأ وسائط الدالة باسم يُشير إلى الوسيط الذي يُمثل جزءًا من اسم الدالة، متبوعًا بنقطتين رأسيتين، ثم نوع الوسيط المتوقع بين قوسين، ثم اسم الوسيط. ويمكن حذف التسمية.
- ( void ) setRangeStart: ( int ) start end: ( int ) end ; - ( void ) importDocumentWithName: ( NSString * ) name withSpecifiedPreferences :( Preferences * ) prefs beforePage :( int ) insertPage ;يُعدّ تعريف الواجهة مشتقًا من الفئة ، التي تسمح بإضافة طرق إلى الفئات الموجودة. [ 27 ]
تطبيق
لا تُعرّف الواجهة سوى واجهة الصنف، وليس الطرق نفسها: يُكتب الكود الفعلي في ملف التنفيذ. عادةً ما تحمل ملفات التنفيذ (الطرق) امتداد الملف . .m، والذي كان يُشير في الأصل إلى "الرسائل". [ 28 ]
@implementation classname + ( return_type ) classMethod { // implementation } - ( return_type ) instanceMethod { // implementation } @endتُكتب الدوال باستخدام تعريفات الواجهة الخاصة بها. مقارنة بين لغتي Objective-C و C:
- ( int ) method: ( int ) i { return [ self square_root : i ]; }دالة int ( int i ) { return square_root ( i ); }يسمح بناء الجملة بتسمية الوسائط بشكل زائف .
- ( void ) changeColorToRed: ( float ) red green: ( float ) green blue: ( float ) blue { //... التنفيذ ... }// يتم استدعاؤها على النحو التالي: [ myColor changeColorToRed : 5.0 green : 2.0 blue : 6.0 ];تختلف التمثيلات الداخلية للدالة بين تطبيقات Objective-C المختلفة. فإذا كانت الدالة `myColor` من الصنف ` Color<input>`، -changeColorToRed:green:blue:فقد تُسمى الدالة المُنشأة داخليًا ` <input> _i_Color_changeColorToRed_green_blue`. iيُستخدم هذا الأسلوب للإشارة إلى دالة مُنشأة، حيث يُضاف اسم الصنف ثم اسم الدالة، وتُستبدل النقطتان الرأسيتان بشرطات سفلية. وبما أن ترتيب المعاملات جزء من اسم الدالة، فلا يمكن تغييره ليناسب أسلوب البرمجة أو التعبير كما هو الحال مع المعاملات المُسماة.
مع ذلك، نادرًا ما تُستخدم الأسماء الداخلية للدالة بشكل مباشر. عمومًا، تُحوّل الرسائل إلى استدعاءات دوال مُعرّفة في مكتبة وقت تشغيل Objective-C. ليس بالضرورة أن يكون معروفًا وقت الربط أيّ دالة سيتم استدعاؤها، لأنّ فئة المُستقبِل (الكائن المُرسَل إليه الرسالة) لا يلزم معرفتها إلا في وقت التشغيل.
التفعيل
بمجرد كتابة فئة Objective-C، يمكن إنشاء نسخة منها. يتم ذلك أولاً بتخصيص نسخة غير مهيأة من الفئة (كائن)، ثم تهيئتها. لا يصبح الكائن فعالاً تماماً إلا بعد إتمام الخطوتين. ينبغي إنجاز هاتين الخطوتين بسطر واحد من التعليمات البرمجية، بحيث لا يكون هناك كائن مُخصص لم تتم تهيئته (ولأنه من غير المستحسن الاحتفاظ بالنتيجة الوسيطة، إذ -initقد تُعيد الدالة كائناً مختلفاً عن الكائن الذي استُدعيت عليه).
إنشاء نسخة باستخدام المُهيئ الافتراضي بدون معلمات:
MyObject * foo = [[ MyObject alloc ] init ];إنشاء نسخة باستخدام مُهيئ مخصص:
MyObject * foo = [[ MyObject alloc ] initWithString : myString ];في حالة عدم إجراء أي تهيئة مخصصة، يمكن في كثير من الأحيان استخدام طريقة "new" بدلاً من رسائل alloc-init:
MyObject * foo = [ MyObject new ];كذلك، تُطبّق بعض الأصناف مُهيئات أساليب الصنف. على سبيل المثال +new، تجمع هذه المُهيئات بين +allocو -init، ولكن على عكس +new، فإنها تُعيد نسخة مُحررة تلقائيًا. بعض مُهيئات أساليب الصنف تأخذ مُعاملات:
MyObject * foo = [ MyObject object ]; MyObject * bar = [ MyObject objectWithString : @"Wikipedia :)" ];تقوم رسالة التخصيص بتخصيص ذاكرة كافية للاحتفاظ بجميع متغيرات المثيل لكائن ما، وتعيين جميع متغيرات المثيل إلى قيم صفرية، وتحويل الذاكرة إلى مثيل للفئة؛ لا تكون الذاكرة في أي مرحلة أثناء التهيئة مثيلًا للفئة الأصلية.
تقوم رسالة التهيئة بإعداد الكائن عند إنشائه. غالبًا ما تُكتب دالة التهيئة على النحو التالي :
- ( id ) init {self = [ super init ];إذا ( الذات ) {// قم بتهيئة الكائن هنا}أعد الذات ؛}في المثال أعلاه، لاحظ idنوع الإرجاع. يمثل هذا النوع مؤشرًا إلى أي كائن في لغة Objective-C (انظر قسم الكتابة الديناميكية ).
يُستخدم نمط المُهيئ لضمان تهيئة الكائن بشكل صحيح بواسطة فئته الأصلية قبل أن تقوم دالة التهيئة (init) بتنفيذ عملية التهيئة. ويقوم هذا النمط بالإجراءات التالية:
- السطر 2
- يرسل رسالة إلى نسخة الفئة الأصلية
initويسند النتيجة إلىself(مؤشر إلى الكائن الحالي).
- يرسل رسالة إلى نسخة الفئة الأصلية
- السطر 3
- يتحقق من صحة مؤشر الكائن المُعاد قبل إجراء أي عملية تهيئة.
- السطر 6
- يعيد قيمة الذات إلى المستدعي.
مؤشر الكائن غير الصالح له قيمة فارغة nil؛ تتعامل العبارات الشرطية مثل if`nil` مع `nil` كمؤشر فارغ، لذا لن يتم تنفيذ كود التهيئة إذا [super init]تم إرجاع `nil`. في حال حدوث خطأ في التهيئة، يجب على دالة `init` إجراء أي تنظيف ضروري، بما في ذلك إرسال releaseرسالة إلى `self`، ثم تُرجع nilقيمة للإشارة إلى فشل التهيئة. يجب إجراء أي فحص لمثل هذه الأخطاء فقط بعد استدعاء تهيئة الفئة الأصلية لضمان تدمير الكائن بشكل صحيح.
إذا كان للفئة أكثر من طريقة تهيئة واحدة، فإن واحدة منها فقط ( المهيئ المحدد ) تحتاج إلى اتباع هذا النمط؛ يجب على الآخرين استدعاء المهيئ المحدد بدلاً من مهيئ الفئة الأصلية.
البروتوكولات
في لغات البرمجة الأخرى، تسمى هذه الواجهات .
تم تطوير لغة Objective-C في شركة NeXT لإدخال مفهوم التوريث المتعدد للمواصفات، وليس للتنفيذ، وذلك من خلال إدخال البروتوكولات . هذا نمط يمكن تحقيقه إما كفئة أساسية مجردة متعددة التوريث في لغة C++ ، أو كواجهة ( كما في لغتي Java و C# ). تستخدم Objective-C بروتوكولات مخصصة تُسمى البروتوكولات غير الرسمية، وبروتوكولات يفرضها المُصرّف تُسمى البروتوكولات الرسمية .
البروتوكول غير الرسمي هو قائمة بالأساليب التي يمكن للفئة اختيار تنفيذها. يُذكر في التوثيق، لعدم وجوده في اللغة نفسها. تُنفذ البروتوكولات غير الرسمية كفئة ( انظر أدناه) في NSObject، وغالبًا ما تتضمن أساليب اختيارية، والتي يُمكن أن تُغير سلوك الفئة عند تنفيذها. على سبيل المثال، قد تحتوي فئة حقل نصي على مُفوَّض يُنفذ بروتوكولًا غير رسمي مع أسلوب اختياري لإكمال النص الذي يُدخله المستخدم تلقائيًا. يكتشف حقل النص ما إذا كان المُفوَّض يُنفذ هذا الأسلوب (عبر البرمجة الانعكاسية )، وإذا كان الأمر كذلك، فإنه يستدعي أسلوب المُفوَّض لدعم ميزة الإكمال التلقائي.
البروتوكول الرسمي يُشبه الواجهة في لغات جافا وسي شارب وآدا 2005. وهو عبارة عن قائمة بالأساليب التي يُمكن لأي فئة أن تُعلن عن نفسها لتنفيذها. كانت إصدارات أوبجكتيف-سي السابقة للإصدار 2.0 تشترط على الفئة تنفيذ جميع الأساليب في البروتوكول الذي تُعلن عن نفسها لتبنيه؛ وسيُصدر المُصرّف خطأً إذا لم تُنفذ الفئة جميع الأساليب من بروتوكولاتها المُعلنة. أضافت أوبجكتيف-سي 2.0 دعمًا لتمييز أساليب مُعينة في البروتوكول على أنها اختيارية، ولن يُجبر المُصرّف على تنفيذ الأساليب الاختيارية.
يجب تعريف فئة لتطبيق بروتوكول معين حتى يُقال إنها متوافقة معه. ويمكن اكتشاف ذلك أثناء التشغيل. لا توفر البروتوكولات الرسمية أي تطبيقات؛ فهي ببساطة تضمن للمستخدمين أن الفئات المتوافقة مع البروتوكول ستوفر تطبيقات. في مكتبة NeXT/Apple، يستخدم نظام الكائنات الموزعة البروتوكولات بشكل متكرر لتمثيل قدرات كائن يعمل على نظام بعيد.
بناء الجملة
@protocol NSLocking - ( void ) lock ; - ( void ) unlock ; @endيشير ذلك إلى وجود فكرة مجردة للتأمين. من خلال ذكر أن البروتوكول مُنفَّذ في تعريف الفئة،
@interface NSLock : NSObject < NSLocking > // ... @endتزعم أمثلة NSLock أنها ستوفر تطبيقًا لطريقتي المثال.
الكتابة الديناميكية
تتيح لغة Objective-C، مثل Smalltalk، استخدام الكتابة الديناميكية : حيث يمكن إرسال رسالة إلى كائن غير مُحددة في واجهته. وهذا يُتيح مرونة أكبر، إذ يسمح للكائن "بالتقاط" رسالة وإرسالها إلى كائن آخر قادر على الاستجابة لها بشكل مناسب، أو إرسالها إلى كائن آخر. يُعرف هذا السلوك بتوجيه الرسائل أو تفويضها (انظر أدناه). بدلاً من ذلك، يمكن استخدام معالج أخطاء في حال تعذر توجيه الرسالة. إذا لم يقم الكائن بتوجيه رسالة، أو الاستجابة لها، أو معالجة خطأ، فسيُصدر النظام استثناءً أثناء التشغيل. [ 29 ] إذا أُرسلت الرسائل إلى nil (مؤشر الكائن الفارغ)، فسيتم تجاهلها بصمت أو سيتم إطلاق استثناء عام، وذلك حسب خيارات المُصرّف.
يمكن إضافة معلومات النوع الثابتة إلى المتغيرات بشكل اختياري. ويتم التحقق من هذه المعلومات أثناء الترجمة. في العبارات الأربع التالية، يتم توفير معلومات نوع أكثر تحديدًا. العبارات متكافئة أثناء التشغيل، ولكن المعلومات الإضافية تسمح للمترجم بتنبيه المبرمج إذا لم يتطابق الوسيط المُمرر مع النوع المحدد.
- ( void ) setMyValue: ( id ) foo ;في البيان أعلاه، قد يكون foo من أي فئة.
- ( void ) setMyValue: ( id < NSCopying > ) foo ;في البيان أعلاه، قد يكون foo مثالاً لأي فئة تتوافق مع NSCopyingالبروتوكول.
- ( void ) setMyValue: ( NSNumber * ) foo ;في العبارة أعلاه، يجب أن يكون foo مثيلاً لفئة NSNumber .
- ( void ) setMyValue: ( NSNumber < NSCopying > * ) foo ;في البيان أعلاه، يجب أن يكون foo مثيلاً لفئة NSNumber ، ويجب أن يتوافق مع NSCopyingالبروتوكول.
في لغة Objective-C، تُمثَّل جميع الكائنات كمؤشرات، ولا يُسمح بالتهيئة الثابتة. أبسط كائن هو النوع الذي يُشير إليه المؤشر id ( objc_obj * )، والذي يحتوي فقط على مؤشر isa يصف فئته. أما الأنواع الأخرى من لغة C، مثل القيم والهياكل، فتبقى دون تغيير لأنها ليست جزءًا من نظام الكائنات. يختلف هذا القرار عن نموذج كائنات C++، حيث تُدمج الهياكل والفئات.
إعادة التوجيه
تسمح لغة Objective-C بإرسال رسالة إلى كائن قد لا يستجيب. فبدلاً من الاستجابة أو تجاهل الرسالة، يمكن للكائن إعادة توجيهها إلى كائن آخر قادر على الاستجابة. ويمكن استخدام إعادة التوجيه لتبسيط تطبيق بعض أنماط التصميم ، مثل نمط المراقب أو نمط الوكيل .
يحدد وقت تشغيل Objective-C زوجًا من الطرق فيObject
- طرق إعادة التوجيه:
- ( retval_t ) forward: ( SEL ) sel args: ( arglist_t ) args ; // مع GCC - ( id ) forward: ( SEL ) sel args: ( marg_list ) args ; // مع أنظمة NeXT/Apple
- أساليب العمل:
- ( retval_t ) performv: ( SEL ) sel args: ( arglist_t ) args ; // مع GCC - ( id ) performv: ( SEL ) sel args: ( marg_list ) args ; // مع أنظمة NeXT/Apple
يحتاج الكائن الراغب في تطبيق إعادة التوجيه إلى استبدال دالة إعادة التوجيه بدالة جديدة لتحديد سلوك إعادة التوجيه. performv::لا داعي لاستبدال دالة الإجراء، لأنها ببساطة تُنفذ إجراءً بناءً على المُحدِّد والوسائط. لاحظ النوع SEL، وهو نوع الرسائل في لغة Objective-C.
ملاحظة: في OpenStep و Cocoa و GNUstep، وهي أطر عمل شائعة الاستخدام في Objective-C، لا يتم استخدام الفئة Object. يتم استخدام طريقة الفئة لإجراء التوجيه.-(void)forwardInvocation:(NSInvocation*)anInvocationNSObject
مثال
إليكم مثالاً على برنامج يوضح أساسيات إعادة التوجيه.
- Forwarder.h
#import <objc/Object.h>@interface Forwarder : Object { id recipient ; // الكائن الذي نريد إعادة توجيه الرسالة إليه. }// دوال الوصول. - ( id ) recipient ; - ( id ) setRecipient: ( id ) _recipient ; @end- Forwarder.m
#import "Forwarder.h"@implementation Forwarder - ( retval_t ) forward: ( SEL ) sel args: ( arglist_t ) args { /* * التحقق مما إذا كان المستلم قد استجاب للرسالة. * قد يكون هذا مرغوبًا أو غير مرغوب فيه، على سبيل المثال، إذا لم يستجب المستلم * بدوره للرسالة، فقد يقوم بإعادة توجيهها * بنفسه. */ if ([ recipient respondsToSelector : sel ]) { return [ recipient performv : sel args : args ]; } else { return [ self error : "المستلم لم يستجب" ]; } }- ( id ) setRecipient: ( id ) _recipient { [ recipient autorelease ]; recipient = [ _recipient retain ]; return self ; }- ( id ) recipient { return recipient ; } @end- Recipient.h
#import <objc/Object.h>// كائن مُستقبِل بسيط. @interface Recipient : Object - ( id ) hello ; @end- Recipient.m
#import "Recipient.h"مستلم التنفيذ- ( id ) hello { printf ( "يقول المستلم مرحباً! \n " );أعد الذات ؛ }@نهاية- main.m
#import "Forwarder.h" #import "Recipient.h"int main ( void ) { Forwarder * forwarder = [ Forwarder new ]; Recipient * recipient = [ Recipient new ];[ forwarder setRecipient : recipient ]; // تعيين المُستلِم. /* * لاحظ أن المُرسِل لا يستجيب لرسالة hello! سيتم * إعادة توجيهها. سيتم إعادة توجيه جميع الطرق غير المُعترف بها إلى * المُستلِم * (إذا استجاب لها المُستلِم، كما هو مكتوب في المُرسِل) */ [ forwarder hello ];[ إذن المستلم ]؛ [ إذن المرسل ]؛return 0 ; }ملحوظات
عند تجميع البرنامج باستخدام gcc ، يُبلغ المُجمِّع بما يلي:
$ gcc -x objective-c -Wno-import Forwarder.m Recipient.m main.m -lobjc main.m: في الدالة `main`: main.m:12: تحذير: الدالة `Forwarder` لا تستجيب للرسالة `hello` $يُشير المُصرّف إلى النقطة المذكورة سابقًا، وهي أن البرنامج Forwarderلا يستجيب لرسائل الترحيب. في هذه الحالة، يُمكن تجاهل التحذير بأمان نظرًا لتطبيق آلية إعادة التوجيه. يُنتج تشغيل البرنامج المخرجات التالية:
$ ./a.out يقول المستلم مرحباً!فئات
أثناء تصميم لغة Objective-C، كان أحد الشواغل الرئيسية هو سهولة صيانة قواعد البيانات البرمجية الكبيرة. وقد أظهرت التجارب في مجال البرمجة الهيكلية أن إحدى الطرق الرئيسية لتحسين الكود هي تقسيمه إلى أجزاء أصغر. واستلهامًا من مفهوم "المزيجات" في نظام كائنات Common Lisp ، تم تطوير مفهوم الفئات في Objective-C للمساعدة في هذه العملية. [ 30 ]
تتيح الفئات إمكانية توسيع أساليب الفئة ديناميكيًا أثناء التشغيل . وقد مكّن هذا المبرمج من استخدام الفئات المفتوحة دون الحاجة إلى إعادة تجميع تلك الفئة أو حتى الوصول إلى شفرتها المصدرية. على سبيل المثال، إذا لم يتضمن النظام مدققًا إملائيًا في تطبيق String الخاص به، فيمكن إضافته دون تعديل شفرة مصدر String. [ 30 ]
تصبح الطرق داخل الفئات غير قابلة للتمييز عن الطرق في الصنف عند تشغيل البرنامج. تتمتع الفئة بإمكانية الوصول الكامل إلى جميع متغيرات النسخة داخل الصنف، بما في ذلك المتغيرات الخاصة.
إذا أعلنت فئةٌ ما عن دالةٍ تحمل نفس توقيع دالةٍ موجودةٍ في فئةٍ أخرى، فسيتم اعتماد دالة تلك الفئة. وبالتالي، لا تقتصر قدرة الفئات على إضافة دوال إلى فئةٍ ما فحسب، بل يمكنها أيضًا استبدال الدوال الموجودة. يمكن استخدام هذه الخاصية لإصلاح الأخطاء في فئاتٍ أخرى عن طريق إعادة كتابة دوالها، أو لإحداث تغييرٍ شاملٍ في سلوك فئةٍ ما ضمن البرنامج. أما إذا احتوت فئتان على دوالٍ تحمل نفس الاسم ولكن بتوقيعاتٍ مختلفة، فلا يُحدد أيٌّ من دوال الفئتين سيتم اعتماده.
حاولت لغات برمجة أخرى إضافة هذه الميزة بطرق متنوعة. وقد طورت لغة TOM نظام Objective-C خطوةً أخرى، فأتاحت إضافة المتغيرات أيضًا. بينما استخدمت لغات أخرى حلولًا قائمة على النماذج الأولية ، وأبرزها لغة Self .
تُنفّذ لغتا C# و Visual Basic (.NET) وظائف متشابهة ظاهريًا في شكل دوال إضافية ، [ 30 ] لكنها تفتقر إلى إمكانية الوصول إلى المتغيرات الخاصة بالفئة. [ 31 ] وتُشير لغة Ruby والعديد من لغات البرمجة الديناميكية الأخرى إلى هذه التقنية باسم " تعديل الكود ".
يطبق Logtalk مفهوم الفئات (ككيانات من الدرجة الأولى) التي تشمل وظيفة فئات Objective-C (يمكن أيضًا استخدام فئات Logtalk كوحدات تركيب دقيقة عند تعريف فئات أو نماذج أولية جديدة على سبيل المثال؛ على وجه الخصوص، يمكن استيراد فئة Logtalk افتراضيًا بواسطة أي عدد من الفئات والنماذج الأولية).
مثال على استخدام الفئات
يبني هذا المثال Integerفئةً، وذلك بتعريف فئة أساسية أولاً مع تنفيذ دوال الوصول فقط ، ثم إضافة فئتين فرعيتين، وهما `BaseClass` Arithmeticو` DisplayExtensionClass`، اللتين تَرِثان من الفئة الأساسية. مع أن الفئات الفرعية تستطيع الوصول إلى بيانات الفئة الأساسية الخاصة، إلا أنه من الممارسات الجيدة الوصول إلى هذه البيانات الخاصة عبر دوال الوصول، مما يُساعد على إبقاء الفئات الفرعية أكثر استقلالية عن الفئة الأساسية. يُعدّ تنفيذ دوال الوصول هذه أحد الاستخدامات الشائعة للفئات الفرعية. ومن الاستخدامات الأخرى استخدام الفئات الفرعية لإضافة دوال إلى الفئة الأساسية. مع ذلك، لا يُعتبر استخدام الفئات الفرعية لتجاوز الفئات الفرعية، والمعروف أيضاً باسم " تعديل الفئات الفرعية"، ممارسة جيدة . تُنفَّذ البروتوكولات غير الرسمية كفئة فرعية في الفئة الأساسية NSObject. اصطلاحاً، تحمل الملفات التي تحتوي على فئات فرعية تُرَفِّع الفئات الأساسية اسم BaseClass+ExtensionClass.h .
- Integer.h
#import <objc/Object.h>@interface Integer : Object { int integer ; }- ( int ) عدد صحيح ؛ - ( id ) عدد صحيح: ( int ) عدد صحيح _ ؛ @end
- Integer.m
#import "Integer.h"@implementation Integer - ( int ) integer { return integer ; }- ( id ) عدد صحيح: ( int ) عدد صحيح _عدد صحيح { عدد صحيح = عدد صحيح _عدد صحيح ؛ إرجاع الذات ؛ } @end
- Integer+Arithmetic.h
#import "Integer.h"@interface Integer (Arithmetic) - ( id ) add: ( Integer * ) addend ; - ( id ) sub: ( Integer * ) subtrahend ; @end
- Integer+Arithmetic.m
#import "Integer+Arithmetic.h"@implementation Integer (Arithmetic) - ( id ) add: ( Integer * ) addend { return [ self integer : [ self integer ] + [ addend integer ]]; }- ( id ) sub: ( Integer * ) subtrahend { return [ self integer : [ self integer ] - [ subtrahend integer ]]; } @end
- Integer+Display.h
#import "Integer.h"@interface Integer (Display) - ( id ) showstars ; - ( id ) showint ; @end
- Integer+Display.m
# استيراد "Integer+Display.h"@implementation Integer (Display) - ( id ) showstars { int i , x = [ self integer ]; for ( i = 0 ; i < x ; i ++ ) { printf ( "*" ); } printf ( " \n " );أعد الذات ؛ }- ( id ) showint { printf ( "%d \n " , [ self integer ]);return self ; } @end
- main.m
#import "Integer.h"#import "Integer+Arithmetic.h"#import "Integer+Display.h"int main ( void ) {Integer * num1 = [ Integer new ], * num2 = [ Integer new ];int x ;printf ( "أدخل عددًا صحيحًا: " );scanf ( "%d" , & x );[ num1 عدد صحيح : x ];[ نجوم العرض رقم 1 ]؛printf ( "أدخل عددًا صحيحًا: " );scanf ( "%d" , & x );[ num2 عدد صحيح : x ];[ num2 showstars ];[ num1 add : num2 ];[ num1 showint ];أرجع 0 ؛}
ملحوظات
يتم التجميع، على سبيل المثال، بواسطة:
$ gcc -x objective-c main.m Integer.m Integer+Arithmetic.m Integer+Display.m -lobjc يمكن تجربة حذف السطرين #import "Integer+Arithmetic.h"(2) و (21) أثناء عملية الترجمة البرمجية، وسيظل البرنامج يعمل. هذا يعني إمكانية دمج وتنسيق الفئات المضافة حسب الحاجة؛ فإذا لم تكن هناك حاجة لفئة معينة، يمكن ببساطة عدم تضمينها في الترجمة.[num1add:num2]Integer+Arithmetic.m
التظاهر
تسمح لغة Objective-C لفئة ما باستبدال فئة أخرى بالكامل داخل البرنامج. ويُقال إن الفئة البديلة "تتظاهر" بأنها الفئة المستهدفة.
تم اعتبار خاصية "Class posing" قديمة مع نظام التشغيل Mac OS X v10.5 ، وهي غير متاحة في بيئة التشغيل 64 بت . يمكن تحقيق وظيفة مماثلة باستخدام "method swizzling" في الفئات، حيث يتم تبديل تنفيذ دالة ما بتنفيذ دالة أخرى لها نفس التوقيع.
بالنسبة للإصدارات التي لا تزال تدعم خاصية العرض، يتم استقبال جميع الرسائل المرسلة إلى الفئة المستهدفة بواسطة فئة العرض. وهناك عدة قيود:
- لا يجوز للفئة أن تتظاهر إلا بأنها واحدة من فئاتها العليا المباشرة أو غير المباشرة.
- يجب ألا يقوم الصنف الذي يقوم بوضع النموذج بتعريف أي متغيرات مثيل جديدة غير موجودة في الصنف المستهدف (على الرغم من أنه قد يقوم بتعريف أو تجاوز الأساليب).
- قد لا تكون الفئة المستهدفة قد تلقت أي رسائل قبل عملية الطرح.
يُتيح وضع النماذج، على غرار التصنيفات، توسيعًا شاملًا للفئات الموجودة. كما يُتيح وضع النماذج ميزتين غير موجودتين في التصنيفات:
- يمكن لفئة التظاهر استدعاء الطرق المتجاوزة من خلال super، وبالتالي دمج تنفيذ الفئة المستهدفة.
- يمكن لفئة العرض تجاوز الطرق المحددة في الفئات.
على سبيل المثال،
@interface CustomNSApplication : NSApplication @end@implementation CustomNSApplication - ( void ) setMainMenu: ( NSMenu * ) menu { // تنفيذ إجراء ما على القائمة } @endclass_poseAs ([ CustomNSApplication class ], [ NSApplication class ]);هذا يعترض كل استدعاء لـ setMainMenu إلى NSApplication.
#يستورد
في لغة C، #includeيؤدي توجيه pre-compile دائمًا إلى إدراج محتويات الملف في المصدر عند تلك النقطة. أما في لغة Objective-C، فيوجد توجيه #importمكافئ، باستثناء أنه يتم تضمين كل ملف مرة واحدة فقط لكل وحدة تجميع، مما يلغي الحاجة إلى حواجز التضمين .
يجب عدم الخلط بين توجيه Objective-C والكلمة المفتاحية C++import ، المستخدمة لاستيراد وحدات C++ (منذ C++20 )، وهي ليست توجيهًا للمعالج المسبق. كما يجب عدم الخلط بينها وبين #importتوجيه المعالج المسبق في Microsoft Visual C++ (MSVC)، وهو توجيه غير قياسي ويُستخدم لاستيراد مكتبات الأنواع. [ 32 ]
تجميع Linuxgcc
// الملف: hello.m #import <Foundation/Foundation.h> int main ( int argc , const char * argv []) { /* برنامجي الأول بلغة Objective-C */ NSLog ( @"Hello, World! \n " ); return 0 ; }# سطر أوامر التجميع لمترجم gcc ومترجم MinGW: $ gcc \ $ ( gnustep-config --objc-flags ) \ -o hello \ hello.m \ -L /GNUstep/System/Library/Libraries \ -lobjc \ -lgnustep-base./hello ميزات أخرى
تتيح ميزات لغة Objective-C في كثير من الأحيان حلولاً مرنة، وسهلة في كثير من الأحيان، لمشاكل البرمجة.
- يمكن تنفيذ تفويض الأساليب إلى كائنات أخرى والاستدعاء عن بعد بسهولة باستخدام الفئات وإعادة توجيه الرسائل.
- تتيح عملية تبديل مؤشر ISA تغيير الفئات أثناء التشغيل. تُستخدم هذه العملية عادةً لأغراض تصحيح الأخطاء ، حيث تُحوّل الكائنات المُحرّرة إلى كائنات مُعلقة، وظيفتها الوحيدة هي الإبلاغ عن خطأ عند استدعائها. كما استُخدمت هذه العملية في إطار عمل Enterprise Objects Framework لإنشاء أخطاء في قواعد البيانات. ويستخدم إطار عمل Foundation Framework من Apple هذه العملية اليوم لتنفيذ مراقبة قيم المفاتيح .
تعديلات رئيسية
أوبجكتيف-سي 2.0
في مؤتمر المطورين العالمي لعام 2006 ، أعلنت آبل عن إصدار "Objective-C 2.0"، وهو نسخة مُحسّنة من لغة Objective-C تتضمن "جمع البيانات المهملة الحديث، وتحسينات في بناء الجملة، [ 33 ] وتحسينات في أداء وقت التشغيل، [ 34 ] ودعم 64 بت". وتضمن نظام التشغيل Mac OS X v10.5 ، الذي صدر في أكتوبر 2007، مُصرّف Objective-C 2.0. يدعم GCC 4.6 العديد من ميزات Objective-C الجديدة، مثل الخصائص المُعلنة والمُصنّعة، وبناء الجملة النقطي، والتعداد السريع، وطرق البروتوكول الاختيارية، وسمات الطريقة/البروتوكول/الفئة، وامتدادات الفئات، وواجهة برمجة تطبيقات GNU Objective-C الجديدة لوقت التشغيل. [ 35 ]
يمثل اسم Objective-C 2.0 قطيعةً في نظام ترقيم إصدارات اللغة، حيث كان آخر إصدار من Objective-C لنظام NeXT هو "objc4". [ 36 ] وقد تم الاحتفاظ باسم هذا المشروع في آخر إصدار من شفرة المصدر لوقت تشغيل Objective-C القديمة في نظام التشغيل Mac OS X Leopard (10.5). [ 37 ]
جمع القمامة
وفرت لغة Objective-C 2.0 جامع قمامة اختياريًا محافظًا يعتمد على الأجيال . عند تشغيلها في وضع التوافق مع الإصدارات السابقة ، حوّل وقت التشغيل عمليات عدّ المراجع، مثل "retain" و"release"، إلى عمليات لا تُحدث أي تغيير . خضعت جميع الكائنات لعملية جمع القمامة عند تفعيلها. يمكن تحديد مؤشرات C العادية باستخدام "__strong" لتفعيل اعتراضات مُصرّف حاجز الكتابة الأساسي، وبالتالي المشاركة في عملية جمع القمامة. [ 38 ] كما تم توفير نظام فرعي ضعيف لتصفير المؤشرات التي تحمل علامة "__weak" بحيث يتم تعيينها إلى الصفر عند جمع الكائن (أو ببساطة، ذاكرة جامع القمامة). لا يوجد جامع قمامة في تطبيق Objective-C 2.0 لنظام iOS. [ 39 ] يعمل جمع القمامة في Objective-C على مؤشر ترابط خلفي ذي أولوية منخفضة، ويمكن إيقافه عند أحداث المستخدم، بهدف الحفاظ على استجابة تجربة المستخدم. [ 40 ]
تم إيقاف استخدام خاصية جمع البيانات المهملة في نظام التشغيل Mac OS X الإصدار 10.8 لصالح خاصية عد المراجع التلقائي (ARC). [ 41 ] يستخدم Objective-C على نظام iOS 7 الذي يعمل على معالج ARM64 تسعة عشر بتًا من أصل كلمة 64 بت لتخزين عدد المراجع، وذلك على شكل مؤشرات مُوسومة . [ 42 ] [ 43 ]
ملكيات
يُقدّم Objective-C 2.0 صيغةً جديدةً لتعريف متغيرات النسخة كخصائص ، مع سمات اختيارية لضبط إنشاء دوال الوصول. تُعتبر الخصائص، بمعنى ما، متغيرات نسخة عامة؛ أي أن تعريف متغير نسخة كخاصية يُتيح للفئات الخارجية الوصول إلى تلك الخاصية (قد يكون محدودًا، مثلاً للقراءة فقط). يمكن تعريف الخاصية على أنها "للقراءة فقط"، ويمكن تزويدها بدلالات تخزين مثل `readonly` أو assign` copyrequire` retain. افتراضيًا، تُعتبر الخصائص ` atomicreadonly`، مما يُنشئ قفلًا يمنع عدة سلاسل عمليات من الوصول إليها في الوقت نفسه. يمكن تعريف الخاصية على أنها `readonly` nonatomic، مما يُزيل هذا القفل.
@interface Person : NSObject { @public NSString * name ; @private int age ; }@property ( copy ) NSString * name ; @property ( readonly ) int age ;- ( id ) initWithAge: ( int ) age ; @endتُنفَّذ الخصائص باستخدام @synthesizeالكلمة المفتاحية `<property>`، التي تُنشئ دوال الوصول (ودوال التعيين، إن لم تكن للقراءة فقط) وفقًا لتصريح الخاصية. بدلاً من ذلك، يجب تنفيذ دوال الوصول والتعيين بشكل صريح، أو @dynamicيمكن استخدام الكلمة المفتاحية `<property>` للإشارة إلى أن دوال الوصول ستُوفَّر بوسائل أخرى. عند التجميع باستخدام clang 3.1 أو أحدث، تُعرَّف جميع الخصائص التي لم تُصرَّح عنها صراحةً باستخدام `<property>`، أو التي لم تُعلَّم @dynamicبعلامة `<property>`، readonlyأو التي تحتوي على دوال وصول وتعيين كاملة مُنفَّذة من قِبل المستخدم، ضمنيًا باستخدام @synthesize`<property>`.
@implementation Person @synthesize name ;- ( id ) initWithAge: ( int ) initAge { self = [ super init ]; if ( self ) { // ملاحظة: تعيين مباشر لمتغير النسخة، وليس مُعدِّل الخاصية age = initAge ; } return self ; }- ( int ) العمر { إرجاع العمر ؛ } @endيمكن الوصول إلى الخصائص باستخدام صيغة تمرير الرسائل التقليدية، أو تدوين النقطة، أو، في ترميز المفتاح والقيمة، بالاسم عبر طرق "valueForKey:"/"setValue:forKey:".
Person * aPerson = [[ Person alloc ] initWithAge : 53 ]; aPerson . name = @"Steve" ; // ملاحظة: صيغة النقطة، تستخدم مُعدِّلًا مُصنَّعًا، // مُكافئ لـ [aPerson setName: @"Steve"]; NSLog ( @"الوصول عن طريق الرسالة (%@)، صيغة النقطة (%@)، اسم الخاصية (% @) و " "الوصول المباشر إلى متغير المثيل (% @) " , [ aPerson name ], aPerson . name , [ aPerson valueForKey : @"name" ], aPerson -> name );لاستخدام تدوين النقطة لاستدعاء دوال الوصول إلى الخصائص داخل دالة مثيل، selfيجب استخدام الكلمة المفتاحية التالية:
- ( void ) introduceMyselfWithProperties: ( BOOL ) useGetter { NSLog ( @"مرحباً، اسمي هو %@." , (useGetter ? self.name : name ) ) ; // ملاحظة : الوصول باستخدام getter مقابل الوصول باستخدام ivar }يمكن فحص خصائص الفئة أو البروتوكول بشكل ديناميكي .
int i ; int propertyCount = 0 ; objc_property_t * propertyList = class_copyPropertyList ([ aPerson class ], & propertyCount );for ( i = 0 ; i < propertyCount ; i ++ ) { objc_property_t * thisProperty = propertyList + i ; const char * propertyName = property_getName ( * thisProperty ); NSLog ( @"Person has a property: '%s'" , propertyName ); }متغيرات مثيل غير هشة
توفر لغة Objective-C 2.0 متغيرات مثيل غير قابلة للكسر حيثما يدعمها وقت التشغيل (أي عند إنشاء التعليمات البرمجية لنظام macOS 64 بت، وجميع أنظمة iOS). في وقت التشغيل الحديث، تُضاف طبقة إضافية من التوجيه غير المباشر للوصول إلى متغيرات المثيل، مما يسمح للرابط الديناميكي بتعديل تخطيط المثيل أثناء التشغيل. تتيح هذه الميزة تحسينين مهمين لتعليمات Objective-C البرمجية:
- إنها تقضي على مشكلة واجهة الملفات الثنائية الهشة ؛ إذ يمكن للفئات العليا تغيير أحجامها دون التأثير على التوافق الثنائي.
- يسمح ذلك بتوليد متغيرات النسخة التي توفر الدعم للخصائص في وقت التشغيل دون الحاجة إلى تعريفها في واجهة الفئة.
تعداد سريع
بدلاً من استخدام كائن NSEnumerator أو الفهارس للتكرار عبر مجموعة، يوفر Objective-C 2.0 صيغة تعداد سريعة. في Objective-C 2.0، الحلقات التالية متكافئة وظيفيًا، ولكنها تختلف في خصائص الأداء.
// باستخدام NSEnumerator NSEnumerator * enumerator = [ thePeople objectEnumerator ]; Person * p ;بينما (( p = [ enumerator nextObject ]) != nil ) { NSLog ( @"%@ عمره %i سنة." , [ p name ], [ p age ]); }// استخدام الفهارس for ( int i = 0 ; i < [ thePeople count ]; i ++ ) { Person * p = [ thePeople objectAtIndex : i ]; NSLog ( @"%@ is %i years old.” , [ p name ], [ p age ]); }// استخدام التعداد السريع for ( Person * p in thePeople ) { NSLog ( @"%@ عمره %i سنة." , [ p name ], [ p age ]); }يؤدي التعداد السريع إلى توليد كود أكثر كفاءة من التعداد القياسي لأن استدعاءات الأساليب للتعداد على الكائنات يتم استبدالها بحسابات المؤشرات باستخدام بروتوكول NSFastEnumeration. [ 44 ]
لا تتوفر ميزة NSFastEnumeration في نظام التشغيل Mac OS X الإصدار 10.4 أو الإصدارات الأقدم. ولن تعمل الملفات الثنائية المُجمَّعة لاستخدام هذه الميزة على هذه الإصدارات الأقدم من نظام التشغيل Mac OS X.
امتدادات الفئات
يُستخدم امتداد الفئة بنفس صيغة تعريف الفئة بدون اسم الفئة، وتُضاف الطرق والخصائص المُعلنة فيه مباشرةً إلى الفئة الرئيسية. ويُستخدم غالبًا كبديل للفئة لإضافة طرق إلى فئة دون الإعلان عنها في ملفات الرأس العامة، مع ميزة أن المُصرّف يتحقق من تنفيذ جميع الطرق المُعلنة بشكل خاص في امتدادات الفئات. [ 45 ]
مكعبات
Blocks هي إضافة للغة Objective-C (و C و C++ ) تستخدم صيغة خاصة لإنشاء الدوال المغلقة . لا تدعم Blocks إلا أنظمة Mac OS X 10.6 "Snow Leopard" أو أحدث، و iOS 4 أو أحدث، وGNUstep مع مكتبة libobjc2 1.7 والتجميع باستخدام clang 3.1 أو أحدث. [ 46 ]
#include <stdio.h> #include <Block.h> typedef int ( ^ IntBlock )();IntBlock MakeCounter ( int start , int increment ) { __block int i = start ;return Block_copy ( ^ { int ret = i ; i += increment ; return ret ; });}int main ( void ) { IntBlock mycounter = MakeCounter ( 5 , 2 ); printf ( "الاستدعاء الأول: %d \n " , mycounter ()); printf ( "الاستدعاء الثاني: %d \n " , mycounter ()); printf ( "الاستدعاء الثالث: %d \n " , mycounter ());/* لأنه تم نسخه، يجب تحريره أيضًا */ Block_release ( mycounter );return 0 ; } /* الناتج: الاستدعاء الأول: 5 الاستدعاء الثاني: 7 الاستدعاء الثالث: 9 */لغة البرمجة أوبجكتيف سي الحديثة
أضافت آبل بعض الميزات الإضافية إلى Objective 2.0 بمرور الوقت. وتصف آبل هذه التغييرات بأنها تنطبق على "مُصرّف Apple LLVM " (clang) فقط، ولكنها موجودة أيضًا في إصدارات clang مفتوحة المصدر. ومن المثير للارتباك أن نظام الترقيم المستخدم من قِبل آبل يختلف عن نظام الترقيم المستخدم في LLVM الأصلي؛ راجع قسم إصدارات مجموعة أدوات Xcode للاطلاع على ترجمة إلى أرقام إصدارات LLVM مفتوحة المصدر. [ 47 ]
عد المراجع التلقائي
تُعدّ خاصية عدّ المراجع التلقائي (ARC) ميزةً تُفعّل أثناء الترجمة البرمجية، وتُغني المبرمجين عن إدارة عدّ المراجع يدويًا باستخدام أدوات مثل `require` و` retainrequire` release. [ 48 ] على عكس عملية جمع البيانات المهملة التي تتم أثناء التشغيل، تُزيل خاصية ARC عبء عملية منفصلة لإدارة عدّ المراجع. لا تتعارض خاصية ARC مع إدارة الذاكرة اليدوية؛ إذ يُمكن للمبرمجين الاستمرار في استخدام التعليمات البرمجية غير المُفعّلة لخاصية ARC في المشاريع التي تدعمها، وذلك بتعطيل خاصية ARC لملفات التعليمات البرمجية الفردية. كما يُمكن لـ Xcode محاولة ترقية المشروع تلقائيًا إلى خاصية ARC.
تم تقديم ARC في LLVM 3.0. وهذا يترجم إلى Xcode 4.2 (2011)، أو مُصرّف Apple LLVM 3.0. [ 49 ]
حرفيًا
لطالما تضمنت بيئات تشغيل NeXT وApple Obj-C طريقة مختصرة لإنشاء سلاسل نصية جديدة، باستخدام الصيغة الحرفية @"a new string"، أو الانتقال إلى ثوابت CoreFoundation وحلقات kCFBooleanTruefor kCFBooleanFalseذات NSNumberالقيم المنطقية. يوفر استخدام هذه الصيغة على المبرمج عناء استخدام initWithString:الطرق الأطول أو المشابهة عند إجراء عمليات معينة.
عند استخدام مُصرّف Apple LLVM 4.0 (Xcode 4.4) أو إصدار أحدث، يُمكن إنشاء المصفوفات والقواميس والأرقام ( NSArrayوفئات NSDictionaryأخرى ) باستخدام الصيغة الحرفية بدلاً من الدوال. [ 50 ] (يُترجم مُصرّف Apple LLVM 4.0 إلى LLVM مفتوح المصدر وClang 3.1.) [ 51 ]NSNumber
مثال بدون قيم حرفية:
NSArray * myArray = [ NSArray arrayWithObjects : object1 , object2 , object3 , nil ]; NSDictionary * myDictionary1 = [ NSDictionary dictionaryWithObject : someObject forKey : @"key" ]; NSDictionary * myDictionary2 = [ NSDictionary dictionaryWithObjectsAndKeys : object1 , key1 , object2 , key2 , nil ]; NSNumber * myNumber = [ NSNumber numberWithInt : myInt ]; NSNumber * mySumNumber = [ NSNumber numberWithInt : ( 2 + 3 )]; NSNumber * myBoolNumber = [ NSNumber numberWithBool : YES ];مثال باستخدام القيم الحرفية:
NSArray * myArray = @[ object1 , object2 , object3 ] ; NSDictionary * myDictionary1 = @{ @"key" : someObject } ; NSDictionary * myDictionary2 = @{ key1 : object1 , key2 : object2 } ; NSNumber * myNumber = @( myInt ) ; NSNumber * mySumNumber = @( 2 + 3 ) ; NSNumber * myBoolNumber = @YES ; NSNumber * myIntegerNumber = @8 ;في إصدارات Xcode السابقة للإصدار 13، على عكس القيم النصية، كانت المصفوفات والقواميس والقيم العددية تُترجم إلى كود مكافئ لاستدعاءات الدوال المذكورة أعلاه. وبالتحديد، في ظل إدارة الذاكرة التي تعتمد على عدّ المراجع يدويًا، كانت هذه الكائنات تُحرر تلقائيًا، مما استلزم عناية إضافية عند استخدامها، على سبيل المثال، مع متغيرات الدوال الثابتة أو أنواع أخرى من المتغيرات العامة.
في Xcode 13 (إصدار clang 13.0.0 [ 52 ] ) والإصدارات الأحدث، يمكن تضمين المصفوفات والقواميس والقيم العددية في الملف التنفيذي أثناء الترجمة، تمامًا مثل السلاسل النصية. هذه الميزة مُفعّلة افتراضيًا على منصات Apple، ويمكن التحكم بها باستخدام علامات -fno-objc-constant-literalsالمُترجم ذات الصلة. [ 53 ]
الاشتراك السفلي
عند استخدام مُصرّف Apple LLVM الإصدار 4.0 أو أحدث، يُمكن التعامل مع المصفوفات والقواميس ( NSArrayوالفئات ) باستخدام الفهرسة. [ 50 ] يُمكن استخدام الفهرسة لاسترجاع القيم من الفهارس (المصفوفات) أو المفاتيح (القواميس)، ومع الكائنات القابلة للتغيير، يُمكن استخدامها أيضًا لتعيين الكائنات للفهارس أو المفاتيح. في الشيفرة البرمجية، تُمثَّل الفهرسة باستخدام الأقواس . [ 54 ]NSDictionary[ ]
مثال بدون استخدام الرموز السفلية:
id object1 = [ someArray objectAtIndex : 0 ]; id object2 = [ someDictionary objectForKey : @"key" ]; [ someMutableArray replaceObjectAtIndex : 0 withObject : object3 ]; [ someMutableDictionary setObject : object4 forKey : @"key" ];مثال مع استخدام الرموز السفلية:
id object1 = someArray [ 0 ]; id object2 = someDictionary [ @"key" ]; someMutableArray [ 0 ] = object3 ; someMutableDictionary [ @"key" ] = object4 ;صيغ اللغة
أوبجكتيف-سي++
لغة Objective-C++ هي صيغة لغوية مقبولة من قِبل واجهة المستخدم لمجموعة مُترجمات GNU و Clang ، والتي تُتيح ترجمة ملفات المصدر التي تستخدم مزيجًا من صيغتي C++ وObjective-C. طُوّرت هذه اللغة بواسطة شركة NeXT بناءً على طلب شركة Lotus Development أثناء تطوير برنامج Improv للجداول الإلكترونية عام 1989. [ 55 ] وقد ورد مصطلح "Objective-C++" سابقًا في وثائق Apple الخاصة بمُترجم Objective-C، ولكن تم حذفه لاحقًا. [ 56 ]
تضيف لغة Objective-C++ إلى لغة C++ الامتدادات التي تضيفها لغة Objective-C إلى لغة C. ونظرًا لعدم وجود أي جهود لتوحيد دلالات ميزات اللغة المختلفة، فإن بعض القيود تُطبق:
- لا يمكن أن تشتق فئة C++ من فئة Objective-C والعكس صحيح. [ 55 ]
- لا يمكن تعريف مساحات الأسماء في لغة C++ داخل تعريف Objective-C.
- لا يجوز أن تظهر تعريفات Objective-C إلا في النطاق العام، وليس داخل مساحة اسم C++.
- لا يمكن أن تحتوي فئات Objective-C على متغيرات مثيل لفئات C++ التي تفتقر إلى مُنشئ افتراضي أو التي تحتوي على طريقة افتراضية واحدة أو أكثر ، ولكن يمكن استخدام المؤشرات إلى كائنات C++ كمتغيرات مثيل دون قيود (قم بتخصيصها باستخدام new في طريقة -init).
- لا يمكن تطبيق دلالات C++ "بالقيمة" على كائنات Objective-C، والتي لا يمكن الوصول إليها إلا من خلال المؤشرات.
- لا يمكن تضمين تعريف Objective-C داخل تعريف قالب C++ والعكس صحيح. مع ذلك،
Classname *يمكن استخدام أنواع Objective-C (مثلاً) كمعاملات قالب C++. - تختلف معالجة الاستثناءات في لغتي Objective-C وC++ ؛ إذ لا يمكن لمعالجات كل منهما معالجة استثناءات النوع الآخر. ونتيجةً لذلك، لا يتم تشغيل دوال تدمير الكائنات. وقد تم التخفيف من هذه المشكلة في بيئات تشغيل "Objective-C 2.0" الحديثة ، حيث يتم استبدال استثناءات Objective-C باستثناءات C++ إما كليًا (بيئة تشغيل Apple)، أو جزئيًا عند ربط مكتبة Objective-C++ ( GNUStep libobjc2). [ 56 ]
- تُعتبر كتل Objective-C وتعبيرات لامدا C++11 كيانات منفصلة. ومع ذلك، يتم إنشاء كتلة بشكل شفاف على نظام macOS عند تمرير تعبير لامدا حيث يُتوقع وجود كتلة. [ 57 ]
بناء جملة Objective-C "الحديث" (1997)
بعد استحواذ آبل على شركة NeXT، بُذلت محاولات لجعل لغة Objective-C أكثر قبولًا لدى المبرمجين الأكثر دراية بلغة Java من Smalltalk. تمثلت إحدى هذه المحاولات في تقديم ما سُمي آنذاك "بالصيغة الحديثة" للغة Objective-C [ 58 ] (مقارنةً بالصيغة "الكلاسيكية" الحالية). لم يطرأ أي تغيير على السلوك، بل كانت هذه مجرد صيغة بديلة. فبدلًا من كتابة استدعاء دالة على النحو التالي:
object = [[ MyClass alloc ] init ]; [ object firstLabel : param1 secondLabel : param2 ];بل كُتبت على النحو التالي:
object = ( MyClass.alloc ) .init ; object.labels ( param1 , param2 ) ;وبالمثل، انتقلت التصريحات من الشكل
- ( void ) firstLabel : ( int ) param1 secondLabel : ( int ) param2 ;ل
- ( void ) labels ( int param1 , int param2 );لم يعد هذا التركيب "الحديث" مدعومًا في اللهجات الحالية للغة Objective-C.
التطبيقات
تم تنفيذ لغة Objective-C في الأصل بواسطة مُصرّف احتكاري من شركة PPI/StepStone (انظر التاريخ أعلاه). قامت شركة NeXT بتنفيذ Objective-C عن طريق تعديل مُصرّف GCC ، مما أتاح استخدام ميزات C الأحدث. حافظت Apple على هذا الوضع لفترة بعد استحواذها على NeXT، مما أدى إلى ظهور Apple GCC وApple LLVM-GCC، وكلاهما توقف عن تلقي التحديثات عند الإصدار 4.2.1 بسبب تغيير GCC لرخصته إلى GPLv3، التي تتضمن بندًا يمنع استخدام Tivoization . [ 36 ] : قررت Apple بدلاً من ذلك البناء على مُصرّف clang الخاص بـ LLVM منذ حوالي عام 2009، والذي يتمتع برخصة أكثر مرونة. تُساهم Apple بتغييرات متعلقة بلغة Objective-C في LLVM، مما يجعلها التنفيذ الأكثر اكتمالاً مفتوح المصدر اعتبارًا من عام 2026.
GNU و GNUstep و WinObjC
لطالما اهتم مشروع جنو بمنصة لنقل برامج NeXT و Obj-C إليها. يشير سجل التغييرات الخاص بدليل libobjc في GCC إلى أنه كان موجودًا قبل عام 1998 (GCC 2.95)، كما يشير ملف README الخاص به إلى إعادة كتابته في عام 1993 (GCC 2.4). [ 59 ]
تم إصدار شفرة المصدر لواجهة NeXT الأمامية لأنها صُممت كجزء من GCC، الذي صدر بموجب رخصة جنو العمومية العامة (GNU GPL) التي تُلزم من يُنشئ أعمالًا مشتقة بالامتثال لها. واصلت آبل هذا النهج بإصدار نسختها المعدلة من GCC حتى الإصدار 4.2.1، ثم تخلت عن المُصرّف بعد ذلك. أخذ القائمون على صيانة GCC التغييرات في الحسبان، لكنهم لم يستثمروا كثيرًا في دعم الميزات الأحدث مثل لغة Objective-C 2.0. [ 36 ] : أي مُصرّف
قام مطورو GNUstep، المهتمون باللغة الجديدة، بنسخ مكتبة GCC libobjc إلى مشروع مستقل عن GCC يُسمى libobjc2 في عام 2009. كما قاموا بترتيب استخدام وقت التشغيل مع Clang للاستفادة من بنية اللغة الجديدة. [ 36 ] : أي مُصرّف؟ في الوقت نفسه، كان GCC يتقدم ببطء، ولكن مع إصدار GCC 4.6.0 (2011)، انتقلوا أيضًا إلى Objective-C 2.0 في مكتبة libobjc الخاصة بهم. [ 35 ] [ 60 ] تشير وثائق GNUstep إلى أن تطبيق GCC لا يزال يفتقر إلى دعم الكتل، والمتغيرات غير الهشة، وARC الأحدث. [ 36 ] : أي وقت تشغيل؟
قامت مايكروسوفت بدمج وقت تشغيل ObjFW في جزء من WinObjC ، وهو جسر iOS لمنصة ويندوز العالمية ، في عام 2015، على الرغم من أنها تحولت إلى نسخة معدلة من libobjc2 في عام 2016. وبالإضافة إلى تطبيقها الخاص لـ Cocoa Touch وواجهات برمجة التطبيقات الأساسية، يسمح المشروع بإعادة استخدام كود تطبيقات iOS داخل تطبيقات UWP. [ 61 ]
في نظام ويندوز، تتوفر أدوات تطوير Objective-C للتنزيل من موقع GNUStep الإلكتروني. يتكون نظام تطوير GNUStep من الحزم التالية: GNUstep MSYS System، وGNUstep Core، وGNUstep Devel، وGNUstep Cairo، وProjectCenter IDE (شبيه بـ Xcode، ولكنه أبسط)، وGorm (أداة بناء واجهات المستخدم، شبيهة بأداة بناء ملفات NIB في Xcode). لم يتم تحديث هذه المثبتات الثنائية منذ عام 2016، [ 62 ] لذا يُفضل تثبيتها مباشرةً باستخدام Cygwin أو MSYS2 .
كلانغ
تُنفّذ مجموعة مُترجمات Clang ، وهي جزء من مشروع LLVM ، لغة Objective-C ولغات أخرى. بعد أن تحوّل GCC 4.3 (2008) إلى رخصة GPLv3، تخلّت عنه Apple لصالح Clang، وهو مُترجم تتمتّع Apple بصلاحيات قانونية أكبر لتعديله. ونتيجةً لذلك، فإنّ العديد من ميزات لغة Objective-C الحديثة مدعومة فقط بواسطة Clang. [ 47 ]
يختلف نظام ترقيم الإصدارات الخاص بشركة Apple لمترجم LLVM المبني على clang عن نظام ترقيم الإصدارات الخاص بـ LLVM مفتوح المصدر. راجع قسم إصدارات مجموعة أدوات Xcode للاطلاع على الترجمة. [ 47 ]
mulle-objc
Mulle-objc هو تطبيق مُحسّن للأداء للغة Objective-C. يستخدم مكتبة وقت تشغيل مكتوبة بلغة C11 خالصة ، مما يضمن قابلية النقل (يدعم، من بين منصات أخرى، أنظمة Linux وFreeBSD وWindows). يمكن ربط مكتبة وقت التشغيل بشكل ثابت مع musl . يستخدم Mulle-objc نسخة مُعدّلة من clang/LLVM كمُصرّف ونسخة مُعدّلة من gdb كمُصحّح أخطاء. [ 63 ] [ 64 ] يتميز Mulle-objc بمجموعة ميزات مُصغّرة عمدًا، يُمكن وصفها بأنها "Objective-C 1.0 مع بعض ميزات 2.0 المُنتقاة بعناية". [ 65 ]
مُجمِّع الكائنات المحمول
كان مُجمِّع الكائنات المحمول (POC) تطبيقًا بديلًا للغة Objective-C. تختلف مجموعة الإضافات التي يُطبِّقها مُجمِّع الكائنات المحمول عن تطبيق GCC/NeXT/Apple؛ فهي تتضمن على وجه الخصوص كتلًا شبيهة بلغة Smalltalk للغة Objective-C، بينما تفتقر إلى البروتوكولات والفئات، وهما ميزتان تُستخدمان على نطاق واسع في OpenStep ومشتقاتها وما يتصل بها. بشكل عام، يُمثِّل مُجمِّع الكائنات المحمول مرحلةً أقدم، ما قبل NeXT، في تطور اللغة، وهو ما يتوافق تقريبًا مع كتاب براد كوكس الصادر عام 1991. [ 66 ]
كما يتضمن مكتبة وقت التشغيل المسماة ObjectPak، والتي تستند إلى مكتبة ICPak101 الأصلية لكوكس (والتي بدورها مشتقة من مكتبة فئة Smalltalk-80)، وهي مختلفة تمامًا عن OpenStep FoundationKit.
استخدام المكتبة
تُستخدم لغة Objective-C اليوم غالبًا بالتزامن مع مكتبة ثابتة من الكائنات القياسية (تُعرف عادةً باسم "مجموعة أدوات" أو "إطار عمل")، مثل Cocoa أو GNUstep أو ObjFW . تأتي هذه المكتبات عادةً مع نظام التشغيل: مكتبات GNUstep غالبًا ما تأتي مع توزيعات Linux ، وCocoa تأتي مع macOS. لا يُجبر المبرمج على وراثة الدوال من الفئة الأساسية الموجودة (NSObject – OFObject). تسمح Objective-C بتعريف فئات جذرية جديدة لا ترث أي دالة موجودة. في الأصل، كانت بيئات البرمجة القائمة على Objective-C تُقدم عادةً فئة Object كفئة أساسية ترث منها جميع الفئات الأخرى تقريبًا. مع إطلاق OpenStep، أنشأت NeXT فئة أساسية جديدة باسم NSObject، والتي تُقدم ميزات إضافية مقارنةً بـ Object (مثل التركيز على استخدام مراجع الكائنات وعدّ المراجع بدلًا من المؤشرات الخام). ترث جميع الفئات تقريبًا في Cocoa من NSObject.
لم يقتصر دور إعادة التسمية على تمييز السلوك الافتراضي الجديد للفئات ضمن واجهة برمجة تطبيقات OpenStep، بل سمح أيضًا للتعليمات البرمجية التي تستخدم Object - الفئة الأساسية الأصلية المستخدمة في NeXTSTEP (وغيرها من مكتبات فئات Objective-C) - بالتعايش في نفس بيئة التشغيل مع التعليمات البرمجية التي تستخدم NSObject (مع بعض القيود). كما أصبح إدخال البادئة المكونة من حرفين شكلاً مبسطًا لمساحات الأسماء، وهو ما تفتقر إليه لغة Objective-C. وأصبح استخدام البادئة لإنشاء مُعرّف تغليف غير رسمي معيارًا غير رسمي للبرمجة في مجتمع Objective-C، ولا يزال كذلك حتى اليوم.
في الآونة الأخيرة، بدأت تظهر برامج إدارة الحزم، مثل CocoaPods ، التي تهدف إلى أن تكون مدير حزم ومستودعًا لها في آن واحد. ويمكن الآن تثبيت الكثير من أكواد Objective-C مفتوحة المصدر التي كُتبت في السنوات القليلة الماضية باستخدام CocoaPods.
تحليل اللغة
تستخدم تطبيقات Objective-C نظام تشغيل بسيطًا مكتوبًا بلغة C ، مما لا يزيد حجم التطبيق إلا قليلًا. في المقابل، كانت معظم الأنظمة الموجهة للكائنات في ذلك الوقت تستخدم أنظمة تشغيل افتراضية ضخمة . عادةً ما تكون البرامج المكتوبة بلغة Objective-C صغيرة الحجم، ولا تتجاوز حجم الكود الخاص بها وحجم المكتبات (التي لا يلزم تضمينها عادةً في توزيعة البرنامج)، على عكس أنظمة Smalltalk التي كانت تستهلك قدرًا كبيرًا من الذاكرة لمجرد فتح نافذة. تميل تطبيقات Objective-C إلى أن تكون أكبر حجمًا من تطبيقات C أو C++ المماثلة لأن الكتابة الديناميكية في Objective-C لا تسمح بحذف الدوال أو تضمينها. ولأن المبرمج يتمتع بحرية كبيرة في تفويض الدوال، وإعادة توجيه الاستدعاءات، وإنشاء المحددات أثناء التشغيل، وتمريرها إلى نظام التشغيل، لا يستطيع مُصرّف Objective-C افتراض أنه من الآمن حذف الدوال غير المستخدمة أو تضمين الاستدعاءات.
وبالمثل، يمكن تطبيق اللغة فوق مُجمِّعات لغة C الحالية (في GCC ، أولًا كمعالج مُسبق، ثم كوحدة نمطية) بدلًا من مُجمِّع جديد. وهذا يُتيح للغة Objective-C الاستفادة من المجموعة الضخمة الموجودة من أكواد C والمكتبات والأدوات، إلخ. ويمكن تغليف مكتبات C الحالية بأغلفة Objective-C لتوفير واجهة برمجة كائنية التوجه. وفي هذا الجانب، تُشبه مكتبة GObject ولغة Vala ، اللتين تُستخدمان على نطاق واسع في تطوير تطبيقات GTK .
أدت كل هذه التغييرات العملية إلى خفض حاجز الدخول ، وهو على الأرجح أكبر مشكلة واجهت القبول الواسع النطاق للغة سمول توك في ثمانينيات القرن العشرين.
من الانتقادات الشائعة أن لغة Objective-C لا تدعم مساحات الأسماء . ولذلك، يُضطر المبرمجون إلى إضافة بادئات إلى أسماء فئاتهم، وهي عادةً أقصر من أسماء مساحات الأسماء، وبالتالي أكثر عرضةً للتضارب. منذ عام 2007، أصبحت جميع فئات ووظائف macOS في بيئة برمجة Cocoa مسبوقة بالبادئة "NS" (مثل NSObject وNSButton) لتمييزها على أنها تابعة لنظام macOS أو iOS الأساسي؛ وتُشتق "NS" من أسماء الفئات كما تم تعريفها أثناء تطوير NeXTSTEP .
بما أن لغة Objective-C هي مجموعة فرعية صارمة من لغة C، فإنها لا تعامل الأنواع الأولية للغة C ككائنات من الدرجة الأولى .
على عكس لغة C++ ، لا تدعم لغة Objective-C إعادة تعريف المعاملات . كما أنها، على عكس C++، تسمح للكائن بالوراثة المباشرة من فئة واحدة فقط (تمنع الوراثة المتعددة ). مع ذلك، في معظم الحالات، يمكن استخدام الفئات والبروتوكولات كبدائل لتحقيق النتائج نفسها.
نظرًا لأن لغة Objective-C تستخدم الكتابة الديناميكية أثناء التشغيل، ولأن جميع استدعاءات الدوال هي استدعاءات دوال (أو في بعض الحالات، استدعاءات نظام)، فإن العديد من تحسينات الأداء الشائعة لا يمكن تطبيقها على دوال Objective-C (على سبيل المثال: التضمين، ونشر الثوابت، والتحسينات بين الإجراءات، والاستبدال العددي للتجميعات). هذا يحد من أداء تجريدات Objective-C مقارنةً بالتجريدات المماثلة في لغات مثل C++ حيث تكون هذه التحسينات ممكنة.
إدارة الذاكرة
لم تدعم الإصدارات الأولى من لغة Objective-C خاصية جمع البيانات المهملة (GC). في ذلك الوقت، كان هذا القرار محل نقاش، إذ اعتبر كثيرون أن فترات التوقف الطويلة (عندما كانت لغة Smalltalk تقوم بعملية الجمع) تجعل النظام بأكمله غير قابل للاستخدام. وقد أضافت بعض تطبيقات الطرف الثالث هذه الميزة، وأبرزها GNUstep التي تستخدم جامع البيانات المهملة Boehm .
قامت آبل بتطبيق خاصية جمع البيانات المهملة (GC) كجزء من لغة Objective-C 2.0 بدءًا من نظام التشغيل Mac OS X v10.5 . [ 67 ] لم تلقَ هذه الميزة الجديدة رواجًا بين المطورين؛ إذ لم تُحوّل آبل نفسها أيًا من تطبيقاتها الداخلية لاستخدام GC، باستثناء Xcode . [ 17 ] وقد أعاق اعتمادها بشدة عدم توفر GC على أجهزة iPhone بسبب مخاوف تتعلق بأداء البرامج . [ 17 ] [ 67 ] في الإصدارات الأحدث من macOS، تم إيقاف استخدام جمع البيانات المهملة لصالح عدّ المراجع التلقائي (ARC)، الذي طُرح في عام 2011. [ 17 ]
باستخدام تقنية ARC، يُدرج المُصرّف استدعاءات الاحتفاظ والإفراج تلقائيًا في كود Objective-C استنادًا إلى تحليل الكود الثابت . تُعفي هذه الأتمتة المبرمج من كتابة كود إدارة الذاكرة. كما تُضيف ARC أيضًا مراجع ضعيفة إلى لغة Objective-C. [ 68 ] [ 69 ]
الاختلافات الفلسفية بين لغة Objective-C ولغة C++
يمثل تصميم وتنفيذ لغتي C++ و Objective-C نهجين مختلفين بشكل أساسي لتوسيع لغة C.
بالإضافة إلى أسلوب البرمجة الإجرائية في لغة C، تدعم لغة C++ بشكل مباشر بعض أشكال البرمجة كائنية التوجه ، والبرمجة العامة ، والبرمجة الوصفية . كما تأتي C++ مزودة بمكتبة قياسية ضخمة تتضمن العديد من فئات الحاويات . وبالمثل، تُضيف لغة Objective-C البرمجة كائنية التوجه ، والكتابة الديناميكية ، والانعكاس إلى لغة C. لا تُوفر Objective-C مكتبة قياسية بحد ذاتها ، ولكن في معظم الحالات التي تُستخدم فيها، تُستخدم مع مكتبة شبيهة بـ OpenStep مثل OPENSTEP أو Cocoa أو GNUstep ، والتي تُوفر وظائف مشابهة للمكتبة القياسية في C++.
يتمثل أحد الفروقات البارزة في أن لغة Objective-C توفر دعمًا أثناء التشغيل لميزات البرمجة الانعكاسية ، بينما لا تضيف لغة C++ سوى قدر ضئيل من هذا الدعم إلى لغة C. في Objective-C، يمكن الاستعلام عن خصائص الكائن نفسه، على سبيل المثال، ما إذا كان سيستجيب لرسالة معينة. أما في C++، فلا يمكن القيام بذلك دون استخدام مكتبات خارجية.
يُعدّ استخدام الانعكاس جزءًا من التمييز الأوسع بين الميزات الديناميكية (أثناء التشغيل) والميزات الثابتة (أثناء الترجمة) للغة البرمجة. ورغم أن لغتي Objective-C وC++ تستخدمان مزيجًا من كلا النوعين، إلا أن Objective-C تُفضّل اتخاذ القرارات أثناء التشغيل، بينما تُفضّل C++ اتخاذ القرارات أثناء الترجمة. ويكمن التوتر بين البرمجة الديناميكية والثابتة في العديد من المفاضلات الكلاسيكية في البرمجة: فالميزات الديناميكية تُضيف مرونة، بينما تُضيف الميزات الثابتة سرعةً ودقةً في التحقق من أنواع البيانات.
يمكن تطبيق البرمجة العامة والبرمجة الوصفية في كلتا اللغتين باستخدام تعدد الأشكال في وقت التشغيل ( التوزيع الديناميكي ). في لغة C++، يتخذ هذا شكل الدوال الافتراضية وتحديد نوع البيانات في وقت التشغيل ، بينما توفر لغة Objective-C الكتابة الديناميكية والانعكاس. تدعم كل من Objective-C وC++ تعدد الأشكال في وقت الترجمة ( الدوال العامة )، وقد أضافت Objective-C هذه الميزة في عام 2015.
انظر أيضاً
- لغة البرمجة سي
- لغة سي++
- كوكو بودز
- مقارنة لغات البرمجة
- GNUStep
- مقارنة مع COM و GObject و SOM و Windows Runtime و XPCOM
- سويفت (لغة برمجة)
- Xcode
- WinObjC (المعروف أيضًا باسم: جسر ويندوز لنظام التشغيل iOS)
مراجع
الاقتباسات
- ↑ "إصدارات وقت التشغيل والمنصات" . Developer.apple.com . مؤرشف من الأصل في 20 يوليو 2016. تم الاطلاع عليه في 24 ديسمبر 2017 .
- ↑ لاتنر، كريس (3 يونيو 2014). " الصفحة الرئيسية لكريس لاتنر" . كريس لاتنر. مؤرشف من الأصل في 4 يونيو 2014. تم الاسترجاع في 3 يونيو 2014.
لغة سويفت هي ثمرة جهد دؤوب من فريق من خبراء اللغة، وخبراء التوثيق، ومطوري تحسين أداء المترجمات، ومجموعة داخلية بالغة الأهمية لتجربة اللغة داخليًا، حيث قدموا ملاحظاتهم للمساعدة في صقل الأفكار واختبارها عمليًا. وبالطبع، استفادت اللغة بشكل كبير من الخبرات المكتسبة بصعوبة من العديد من اللغات الأخرى في هذا المجال، مستمدةً أفكارها من لغات مثل أوبجكتيف-سي، وراست،
وهاسكل
،
وروبي
،
وبايثون
،
وسي شارب
، وسي إل يو، وغيرها الكثير.
- ↑ مطورو أبل (23 أبريل 2013). "لغة برمجة أوبجكتيف-سي (مقدمة)" . شركة أبل. مؤرشف من الأصل في 26 أكتوبر 2018. تم الاطلاع عليه في 15 فبراير 2025 .
- ↑ سينغ، أميت (ديسمبر 2003). "نبذة تاريخية عن نظام التشغيل ماك أو إس إكس" . أرشيف ماك أو إس إكس الداخلي. مؤرشف من الأصل في 14 مايو 2012. تم الاطلاع عليه في 11 يونيو 2012 .
- ↑ "أطر عمل التطبيقات" . أبل. يونيو 2014. مؤرشف من الأصل في 16 فبراير 2019. تم الاسترجاع في 13 فبراير 2019 .
- ↑ كوكس، ناروف وهسو (2020) ، ص. 2.
- ↑ غارلينغ، كاليب (9 يوليو 2012). "لغة برمجة الآيفون الآن ثالث أكثر اللغات استخدامًا في العالم" . مجلة وايرد . مؤرشف من الأصل في 9 سبتمبر 2013. تم الاطلاع عليه في 27 أبريل 2026 .
- ↑ وينتك، ريتشارد (2009). كوكو: المجلد 5 من سلسلة مراجع المطورين من Apple . جون وايلي وأولاده. ISBN 978-0-470-49589-6تم الاطلاع عليه بتاريخ 22 يوليو 2016 .
- ↑ بيانكوزي، ف.؛ واردن، س. (2009). "أوبجكتيف-سي". رواد البرمجة . دار نشر أورايلي ميديا، ص 242-246 . ISBN 978-0-596-51517-1.
- ↑ كوكس، براد (1983). "المترجم المسبق الموجه للكائنات: برمجة دوال Smalltalk-80 بلغة C" . إشعارات ACM SIGPLAN . 18 (1). نيويورك، نيويورك: ACM . doi : 10.1145/948093.948095 . ISSN 0362-1340 . S2CID 6975032. تاريخ الاسترجاع: 17 فبراير 2011 .
- 1 2 كوكس، ناروف وهسو (2020) ، ص. 10-11.
- ↑ " Common Lisp وReadline" . GitHub . مؤرشف من الأصل في 6 سبتمبر 2014. تم الاطلاع عليه في 15 سبتمبر 2014.
ظهرت المشكلة لأول مرة عندما اقترحت شركة NeXT توزيع نسخة معدلة من GCC على جزأين والسماح للمستخدم بربطهما. سألني ستيف جوبز عما إذا كان هذا قانونيًا. بدا لي حينها أنه كذلك، باتباع منطق مشابه لما تستخدمه؛ ولكن نظرًا لأن النتيجة كانت غير مرغوب فيها للغاية بالنسبة للبرمجيات الحرة، قلت إنني سأضطر إلى استشارة محامٍ. ما قاله المحامي فاجأني؛ قال إن القضاة سيعتبرون مثل هذه المخططات "حيلًا" وسيكونون قاسيين جدًا تجاهها. قال إن القاضي سيسأل عما إذا كان البرنامج "فعليًا" برنامجًا واحدًا، بدلًا من كيفية تسميته. لذلك عدت إلى جوبز وقلت إننا نعتقد أن خطته غير مسموح بها بموجب رخصة GPL. والنتيجة المباشرة لذلك هي أن لدينا الآن واجهة أمامية مكتوبة بلغة Objective-C. كانوا يريدون توزيع محلل Objective C كحزمة ملكية منفصلة للربط مع الواجهة الخلفية لـ GCC، ولكن بما أنني لم أوافق على السماح بذلك، فقد جعلوه مجانيًا.
- ↑ كوكس، ناروف وهسو (2020) ، ص 27-28.
- ↑ "جنو ستيب: مقدمة" . مطورو جنو ستيب/مشروع جنو. مؤرشف من الأصل في 6 أغسطس 2012. تم الاطلاع عليه في 29 يوليو 2012 .
- ↑ بوتو، ف.؛ فريث-ماكدونالد، ر.؛ بيرو، ن.؛ روبرت، أ. (2004). "التاريخ". دليل برمجة قاعدة GNUstep للغة Objective-C (ملف PDF) . ص 6.
- ↑ "كريستين كراب ثورب | لينكد إن" . www.linkedin.com . مؤرشف من الأصل بتاريخ 15 يوليو 2014. تم الاطلاع عليه بتاريخ 23 يونيو 2016 .
- 1 2 3 4 Cox, Naroff & Hsu (2020) , ص. 29.
- ↑ "كتابة كود Objective-C" . apple.com. 23 أبريل 2013. مؤرشف من الأصل في 24 ديسمبر 2013. تم الاطلاع عليه في 22 ديسمبر 2013 .
- ↑ "دراسة لغة Objective-C" . دكتور دوبز . مؤرشف من الأصل في 4 سبتمبر 2014. تم الاطلاع عليه في 4 سبتمبر 2014.
Objective-C هي لغة برمجة كائنية التوجه، وهي مجموعة فرعية صارمة من لغة C.
- ↑ لي (2013) ، ص. 3، 381.
- ↑ "علامات رؤوس Objective-C" . مؤرشف من الأصل في 1 أبريل 2017. تم الاطلاع عليه في 11 فبراير 2018.
Objective-C هي مجموعة فرعية من لغة C
- ↑ وقت التشغيل (2009) ، حل الأساليب الديناميكية.
- ↑ شركة آبل (19 أكتوبر 2009). "تجنب أخطاء المراسلة" . لغة البرمجة أوبجكتيف-سي . مؤرشف من الأصل في 8 سبتمبر 2010.
- ↑ وقت التشغيل (2009) ، المراسلة.
- ↑ "objc_msgSend - وقت تشغيل Objective-C" . وثائق مطوري Apple . تم الاطلاع عليه في 10 فبراير 2020 .
- ↑ "المراسلة باستخدام بيئة تشغيل GNU Objective-C" . باستخدام مجموعة مترجمات GNU (GCC) . تم الاطلاع عليه بتاريخ 10 فبراير 2020 .
- ↑ "الفئة" . مطور أبل (كفاءات كوكوا الأساسية) .
- ↑ دالريمبل، مارك؛ كناستر، سكوت (27 يونيو 2012). تعلم لغة أوبجكتيف-سي على نظام ماك . دار نشر أبريس. ص 9. رقم ISBN 9781430241881
كان امتداد .m في الأصل يرمز إلى "الرسائل" عندما تم تقديم لغة Objective-C لأول مرة، في إشارة إلى ميزة مركزية في Objective-
C - ↑ وقت التشغيل (2009) ، إعادة توجيه الرسائل.
- 1 2 3 كوكس، ناروف وهسو (2020) ، ص 23-24.
- ↑ فاغنر، بيل (20 نوفمبر 2025). "أساليب الإضافة (دليل برمجة C#)" . مايكروسوفت ليرن . مايكروسوفت.
- ↑ ويتني، تايلر (29 أغسطس 2019). "توجيه #import (C++)" . مايكروسوفت ليرن . مايكروسوفت .
- ↑ "Objective-C 2.0: المزيد من الأدلة" . Lists.apple.com. 10 أغسطس 2006. مؤرشف من الأصل في 18 يونيو 2009. تم الاطلاع عليه في 30 مايو 2010 .
- ↑ "ردًا على: Objective-C 2.0" . Lists.apple.com. مؤرشف من الأصل بتاريخ 24 نوفمبر 2010. تم الاطلاع عليه بتاريخ 30 مايو 2010 .
- ١ ٢ "سلسلة إصدارات GCC 4.6 - التغييرات والميزات الجديدة والإصلاحات : مشروع جنو : مؤسسة البرمجيات الحرة" . Gcc.gnu.org . مؤرشف من الأصل في 5 يناير 2018. تم الاطلاع عليه في 24 ديسمبر 2017 .
- 1 2 3 4 5 "الأسئلة الشائعة حول Objective-C2" . GNUstep . تم الاطلاع عليه في 6 يناير 2020 .
- ↑ "متصفح المصدر: objc4، 756.2" . برامج أبل مفتوحة المصدر . مؤرشف من الأصل في 6 أغسطس 2020. تم الاطلاع عليه في 6 يناير 2020 .
- ↑ دليل برمجة جمع البيانات المهملة: واجهة برمجة تطبيقات جمع البيانات المهملة، مؤرشفة في 9 يونيو 2012، على موقع Wayback Machine (موقع مطوري Apple - ابحث عن "__strong")
- ↑ "دليل برمجة جمع البيانات المهملة: مقدمة في جمع البيانات المهملة" . شركة آبل. 3 أكتوبر 2011. مؤرشف من الأصل في 9 يونيو 2012. تم الاطلاع عليه في 23 ديسمبر 2011 .
- ↑ "سلسلة تقنيات ليوبارد للمطورين: نظرة عامة على لغة أوبجكتيف-سي 2.0" . شركة آبل، 6 نوفمبر 2007. مؤرشف من الأصل في 24 يوليو 2010. تم الاطلاع عليه في 30 مايو 2010 .
- ↑ "ملاحظات إصدار ARC للانتقال" . شركة آبل، 17 يوليو 2012. مؤرشف من الأصل في 9 يونيو 2012. تم الاطلاع عليه في 26 أغسطس 2012 .
- ↑ مايك آش. "جلسة أسئلة وأجوبة يوم الجمعة 27 سبتمبر 2013: ARM64 وأنت" . mikeash.com. مؤرشف من الأصل في 26 أبريل 2014. تم الاطلاع عليه في 27 أبريل 2014 .
- ↑ "متجر الهامستر: [ شرح Objective - C] : مجموعة تعليمات غير مؤشرة" . Sealiesoftware.com. 24 سبتمبر 2013. مؤرشف من الأصل في 3 يونيو 2014. تم الاطلاع عليه في 27 أبريل 2014 .
- ↑ شركة آبل (2009). "التعداد السريع" . apple.com. مؤرشف من الأصل في 17 ديسمبر 2009. تم الاطلاع عليه في 31 ديسمبر 2009 .
- ↑ مؤسسة البرمجيات الحرة (2011). "سلسلة إصدارات GCC 4.6 - التغييرات والميزات الجديدة والإصلاحات" . Gcc.gnu.org . مؤرشف من الأصل في 2 ديسمبر 2013. تم الاطلاع عليه في 27 نوفمبر 2013 .
- ↑ "مواضيع برمجة الكتل - مكتبة مطوري ماك" . شركة آبل. 8 مارس 2011. مؤرشف من الأصل في 9 يونيو 2012. تم الاطلاع عليه في 28 نوفمبر 2012 .
- ١ ٢ ٣ " العد المرجعي التلقائي (ARC) في Objective-C - وثائق Clang 11" . وثائق Clang . تم الاطلاع عليها في ٢٠ فبراير ٢٠٢٠.
في الوقت الحالي، من الأنسب ترقيم إصدارات هذه الوثيقة وفقًا لإصدارات تطبيقها الوحيد (ومشروعها المضيف)، وهو clang. يشير "LLVM XY" إلى إصدار مفتوح المصدر من clang من مشروع LLVM. يشير "Apple XY" إلى إصدار Apple من مُصرّف Apple LLVM.
- ↑ "الانتقال إلى ARC" . شركة آبل. مؤرشف من الأصل في 7 سبتمبر 2011. تم الاطلاع عليه في 8 أكتوبر 2012 .
- ↑ "ملاحظات إصدار LLVM 3.0" . releases.llvm.org .
- 1 2 "البرمجة باستخدام لغة Objective-C: القيم والمجموعات" . شركة آبل. مؤرشف من الأصل في 7 سبتمبر 2011. تم الاطلاع عليه في 8 أكتوبر 2012 .
- ↑ "ملاحظات إصدار Clang 3.1" . releases.llvm.org .
- ↑ "ملخص GitHub الخاص بـ @yamaya الذي يوثق "سجل إصدار Xcode clang"تمت أرشفة هذا النص من المصدر الأصلي في 17 فبراير 2025. تم الاطلاع عليه في 17 فبراير 2025 .
- ↑ "ملاحظات إصدار Xcode 13 > مُصرّف Apple Clang > الميزات الجديدة" . مؤرشف من الأصل بتاريخ 17 فبراير 2025. تم الاطلاع عليه بتاريخ 17 فبراير 2025 .
- ↑ "القيم الحرفية في لغة Objective-C - توثيق Clang 3.5" . Clang.llvm.org. مؤرشف من الأصل في 6 يونيو 2014. تم الاطلاع عليه في 16 أبريل 2014 .
- 1 2 كوكس، ناروف وهسو (2020) ، ص 24-25.
- 1 2 "استخدام لغة C++ مع لغة Objective-C" . مكتبة مراجع نظام التشغيل Mac OS X. مؤرشف من الأصل في 5 سبتمبر 2010. تم الاطلاع عليه في 12 فبراير 2025 .
- ↑ "امتدادات لغة Clang — وثائق Clang 3.5" . Clang.llvm.org. مؤرشف من الأصل بتاريخ 24 فبراير 2014. تم الاطلاع عليه بتاريخ 16 أبريل 2014 .
- ↑ دليل مطوري رابسودي ، AP Professional، 1997، الصفحات 76-84
- ↑ "gcc/libobjc" . GitHub . gcc-mirror. 6 يناير 2020. تم الاطلاع عليه في 6 يناير 2020.
تمت إعادة كتابة بيئة التشغيل بالكامل في gcc 2.4. كانت بيئة التشغيل السابقة تحتوي على العديد من الأخطاء الجسيمة وكانت غير مكتملة إلى حد كبير.
- ↑ "واجهة برمجة تطبيقات وقت تشغيل GNU Objective-C" . باستخدام GCC . تم الاسترجاع في 6 يناير 2020 .
- ↑ "WinObjC على GitHub" . GitHub . مؤرشف من الأصل في 2 ديسمبر 2017. تم الاطلاع عليه في 13 فبراير 2018 .
- ↑ "مثبت GNUStep" . مؤرشف من الأصل بتاريخ 17 فبراير 2018. تم الاطلاع عليه بتاريخ 14 فبراير 2018 .
- ↑ مول، ن (2015). "mulle-objc: لغة Objective-C جديدة" .
- ↑ "مقدمة" . مشروع mulle-objc . تم الاسترجاع في 26 يناير 2026 .
- ↑ مول، ن. "نقل البرامج: اختلافات عن أوبجيكتيف-سي 2.0". دي ري مول-أوبجيكت .
- ↑ "مترجم الكائنات المحمول" . Users.pandora.be. 1 يناير 1970. مؤرشف من الأصل في 2 أغسطس 2008. تم الاطلاع عليه في 30 مايو 2010 .
- 1 2 تشيسنال (2011) ، ص 83.
- ↑ "ملاحظات إصدار ARC للانتقال" . مكتبة مطوري iOS . Developer.apple.com. مؤرشف من الأصل في 7 سبتمبر 2011. تم الاطلاع عليه في 16 أبريل 2014 .
- ↑ تشيسنال (2011) ، ص 91.
فهرس
- دليل برمجة وقت التشغيل للغة Objective-C . شركة أبل. 19 أكتوبر 2009.
- شيسنال ، ديفيد (أكتوبر 2011). كتاب العبارات الهدف-C ( الطبعة الثانية). أديسون ويسلي . رقم ISBN 978-0-321-81375-6.
- كوكس، براد ج .؛ ناروف، س.؛ هسو، هـ. (12 يونيو 2020). "أصول لغة أوبجكتيف-سي في مؤتمر PPI/Stepstone وتطورها في شركة NeXT" . وقائع مؤتمر ACM للغات البرمجة . 4 (HOPL). رابطة آلات الحوسبة : 1-74 . doi : 10.1145/3386332 . eISSN 2475-1421 .
- لي ، كيث (3 سبتمبر 2013). برو الهدف-C . بيركلي، كاليفورنيا: أبريل . دوى : 10.1007/978-1-4302-5051-7 . رقم ISBN 978-1-4302-5050-0.
للمزيد من القراءة
- كوكس، براد ج. (1991). البرمجة الكائنية التوجه: منهج تطوري . أديسون ويسلي. ISBN 0-201-54834-8.
روابط خارجية
- البرمجة باستخدام لغة Objective-C ، من شركة Apple (13-12-2012)
- لغة البرمجة Objective-C ، من شركة Apple (2014-09-17)
- دليل برمجة GNUstep الأساسي للغة Objective-C
- لغة البرمجة Objective-C من تأليف براد كوكس
- الأسئلة الشائعة حول لغة Objective-C
- مثال Objective-C ( مؤرشف في 23 أبريل 2024، في Wayback Machine )
- أوبجكتيف سي
- عائلة لغات البرمجة C
- لغات البرمجة القائمة على الفئات
- لغات البرمجة المترجمة
- لغات البرمجة ذات الكتابة الديناميكية
- برنامج GNUstep
- التالي
- لغات البرمجة الكائنية التوجه
- لغات البرمجة التي تم إنشاؤها عام 1986
