توضيح لبعض الأمور في objective-c

الدورة المقدمة حالياً هي للمبرمجين عموماً، ولغة objective-c تختلف صياغتها النحوية عن أغلب اللغات المعروفة خصوصاً عند استدعاء الدوال وأفعال الكائنات. فمثلاً السطر التالي:

NSObject *object = [NSObject alloc] init];

يناظر من وجهة نظر نحوية فقط السطرين التاليين:

NSObject *object = NSObject.alloc();
object.init();

أو كما يلي في بعض لغات البرمجة

NSObject *object = NSObject->alloc();
object->init();

ما حدث هنا أننا استدعينا الدالة alloc من الصنف NSObject وأعادت لنا كائناً من الصنف NSObject ثم استدعينا الدالة init من هذا الكائن. حيث تقوم الدالة alloc بحجز مكان في الذاكرة لكائن من نوع NSObject في مثالنا، والدالة init تقوم بتهيئة هذا الكائن. وبالمناسبة لا تفصل أبداً بين alloc, init واجعلها في نفس السطر - أدري حقيقة ماذا سيحدث لوخالفت هنا - حيث تأخد الدالة init نتيجة الدالة alloc مباشرة،

قد يكون هذا المثال معقد لأنه استدعاء داخل استدعاء، لنأخذ المثال التالي:

[object release];

هذا السطر لو أردت تحويلة إلى طريقة معروفة ستكون كالتالي:

object.release();

أو كما يلي في بعض لغات البرمجة

object->release();

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

عند تعريف الدالة نضع نوع القيمة أو المؤشر الذي تعيده الدالة بين قوسين، كما يلي:

- (float)PI
{
     return 3.14
}

بدلاً من:

float PI()
{
     return 3.14
}

حسناً، ما معنى علامة - في البداية؟ هذه تدل على أن هذه الدالة فعل للكائن (instance method) ولو وضعنا علامة + تصبح دالة تستدعى من الصنف مباشرة (class method)

ماذا لو كانت الدالة تحتاج إلى عدة معطيات؟ هنا الأمر يصبح أكثر غرابة

- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
..........
}

هذه الدالة اسمها :tableView:cellForRowAtIndexPath وتستقبل معطيين (وسيطين) أحدهما مؤشر من نوع UITableView واسمه tableView والآخرمؤشر من نوع NSIndexPath واسمه indexPath لاحظ كيف مررنا المعطيات في وسط اسم الدالة، هذه الدالة لو أردنا كتابتها بلغة أخرى كما فعلنا في الأعلى لكانت على الشكل التالي:

UITableViewCell* tableViewCellForRowAtIndexPath(UITableView* tableView, NSIndexPath* indexPath){
..........
}

قد تسأل لم كتبت هكذا؟ أعتقد حتى تكون أكثر قابلية للقراءة وقريبة من الكتابة الطبيعية، هذه وجهة نظر أبل على الأقل.

أتمنى ممن قرأ الدرس أن يخبرني عن رأيه فيه.




التعليقات

ALy 12/12/2011 16:39

يعطيك الف عافيه على هذه الدوره لغة Objective-C معقده شوي الـ Java اسهل بكثييييير الى الان ماني مستوعب الشكل العام للميثود و طرق الاستدعاء


عزوز الحسني 14/12/2011 14:22

الله يعافيك، مع الممارسة ستتعود عليها.


أضف تعليق

الإسم

البريد الإلكتروني

الموقع الشخصي

الرجاء إدخال الكود

نص التعليق