صفحة 2 من 4 الأولىالأولى 1234 الأخيرةالأخيرة
النتائج 11 إلى 20 من 31

الموضوع: المرجع الكامل لتعليم البرمجة بواسطه الماكنتوش بلغة Objective-C لاجهزه ابل


  1. #11
    مراقب منتدى أبل ®Apple الصورة الرمزية للعهد
    تاريخ التسجيل
    Nov 2011
    الدولة
       النمسا
    المشاركات
       2,449
    معدل تقييم المستوى
    881
    نقاط التقييم
                87647
    التعليمات الشرطية


    في بعض الاحيان قد ترغب بجعل شفرتك البرمجية قادرة على توجية
    عملية سير اوامر البرنامج بناء على استيفاء شروط معينة.
    لذا توجد مفردات محجوزة لتحقيق هذا الامر.

    كود HTML:
    [1]
    int age = 42;
    if (age > 30) // The > symbol means
     “greater than”
    {
    NSLog(@”age is older than thirty.”);
     //[1.4]
    }
    NSLog(@”Finished.”); //[1.6]
    السطر [ 1.2 ] يظهر ايعاز استفسار الشرط ... if والذي تنحصر مهمتة
    بتقّييم تحقيق شرط معين. سوف تتعرف على دور الاقواس
    المعقوفة والتي بدورها تحتوي الشفرة البرمجية التي يجب
    تنفيذها متى ما استوفيت صحة حقيقة الشرط المنطقي الصياغة
    و المحصور بين
    الاقواس.
    هنا اذا استوفى الشرط الحقيقة
    if the condition age > 30 عند
    ذلك سيتم طباعة سلسلة الحروف المعينة [
    1.4 ]. ثم سيتم طباعة
    نص سلسلة الحروف المعينة ب [ 1.6 ]، سواء تم استيفاء الشرط
    من عدمة ذلك يعود لان موقعها خارج نطاق الشرط، اي خارج
    الاقواس المعقوفة.
    يمكننا ايضاَ تزويد استعلام الشرط بتعليمات اخرى
    في حال لم يتم الاستيفاء. باستخدام مفردة
    if...else statement بالمثال [ 2].


    كود HTML:
    [2]
    int age = 42;
    if (age > 30)
    {
    NSLog(@”age is older than thirty.”); 
    //[2.4]
    }
    else
    {
    NSLog(@”age is not older thirty.”);
     //[2.7]
    }
    NSLog(@”Finished.”); //[1.6]

    سيتم طباعة النص [
    2.7 ] فقط في حال عدم تحقق الشرط، وذلك
    لن يتحقق هنا بالمثال [
    2]. وبالاضافة الى اقواس المفاضلة ما بين
    القيم الاكبر
    "<“ أو الاصغر “ >" الخاصة بالاعداد يوجد لديك
    معاملات اخرى متنوعة:


    كود HTML:
    == يساوي 
     >اكبر من 
    <اصغر من
    >=اكبر من أو يساوي
    < =اصغر من أو يساوي 
    !=لايساوي

    تمعن بمعامل رمز مفاضلة المساواة هنا حيث لدينا علامتي يساوي
    متكررة
    "==" وهي من السهولة بحيث ان يتم ادراج واحدة فقط
    مع نسيان الاخرى عندها سيتم التعامل مع ذلك الايعاز كاسناد للقيمة بالرغم
    من اننا قد نرغب باجراء اختبار مفاضلة تساوي بين القيم. وذلك خطاء شبه
    شائع ومدعاة للارتباك وأحد اهم اسباب
    وجود اخطاء برمجية بالشفرات المصدرية للمبتدئين.


    ردد معي بصوت عالي و مسموع:
    لن انسى استخدام علامتي يساوي مثل هذه == متى رغبت
    باجراء مفاضلة تساوي بين القيم!

    إن معاملات المفاضلة مفيدة جداَ متى رغبت باجراء
    سلسلة من الايعازات لعدد من المرات. وذلك سيكون موضوع حديثنا
    بالفصل التالي.

    دعنا الان نناقش بعض المفاهيم التي قد يكون لها استخدام مثير.
    و لنتفحص بشكل اعمق عملية المفاضلة هذه. ان نتيجة
    المفاضلة تنحصر بين نتيجتين لا ثالث لهما: النتيجة إما تكون صحيحة أو
    غير-صحيحة
    /خاطئة
    true or false.
    في
    Objective-C ،يتم تمثيل النتيجةالصحيحةأو غير-الصحيحة
    بإما
    1 أو 0 على التوالي. حتى انه يوجد نوع خاص من التصنيفات
    اسمة
    BOOL تنحصر مهمتة باظهار هذه النتيجة. وحتى نقول
    ان قيمة النتيجة
    ”صحيحة true “ يمكنك اما كتابة 1 أو
    YES.
    ولاسناد قيمة غير-صحيحة
    /خاطئة يمكنك اما كتابة 0 أو NO

    كود HTML:
    [3]
    int x = 3;
    BOOL y;
    y = (x == 4); // y will be 0.


    من الممكن عمل اختبار حقيقة لأكثر من شرط.
    ويتم ذلك عندما يتطلب الامر استيفاء كافة الشروط ، عندها نستخدم المعامل
    المنطقي
    AND ، وهو يرد دائما بعلامتي
    .&& : ampersand
    تتقدمه. اما عند اشتراط قيمة صحيحة متحققه لأحد الشروط،
    عندها نستخدم المعامل المنطقي
    OR ، وهو يرد دائما بعلامتي|| .


    كود HTML:
    [4]
    if ( (age >= 18) && (age < 65) )
    {
    NSLog(@”Probably has to work for a       
     living.”);
    }

    من الممكن تعشيش عدة ايعازات اشتراطية
    -
    nested condition .-
    فهي ببساطة تتمثل بادراج شرط داخل الاقواس المعقوفة
    للاشتراط الاول. عندها سيتم تقييم الاشتراط الاول، ثم
    بعد استيفاء تحقيق حقيقة شروطة سيتم تقييم
    الايعاز الشرطي المعشش داخله وهكذا
    تباعاَ
    كود HTML:
    [5]
    if (age >= 18)
    {
    if (age < 65)       
    {
    NSLog(@”Probably has to work for a        
     living.”);
    }        
    }





    9

    تابع

    التعديل الأخير تم بواسطة للعهد ; 13/04/13 الساعة 04:35 PM

  2. #12
    مراقب منتدى أبل ®Apple الصورة الرمزية للعهد
    تاريخ التسجيل
    Nov 2011
    الدولة
       النمسا
    المشاركات
       2,449
    معدل تقييم المستوى
    881
    نقاط التقييم
                87647

    التعليمات المتكررة

    كافة الايعازات والاوامر التي مررنا بها في الشفرات البرمجية
    سابقاَ تنفذ مرة واحدة فقط. يمكننا دوماَ تكرار تنفيذ اوامر الدالات
    باستدعائها مراراَ وتكرارا [َ
    1].

    كود HTML:
    [1]
    NSLog(@”Julia is a pretty actress.”);
    NSLog(@”Julia is a pretty actress.”);
    NSLog(@”Julia is a pretty actress.”);


    بناء على ذلك سيتم استدعاء وتنفيذ الدالة حسب عدد
    المرات التي وردت ولكن تكرار كتابة استدعاء الدالة داخل
    الشفرة يعد امراَ غير عملي. قفي بعض الاحيان يتطلبان
    يتم تكرار تنفيذ الايعاز
    أو الدالة عدد معين من المرات يحدد وقت تشغيل البرنامج.
    مثلها مثل لغات البرمجة الاخرى، تقدم لك لغة
    Objective-C عدة
    طرق لتحقيق ذلك فاذا حددت العدد المطلوب من المرات
    اللازمة لاجراء التكرار على الايعاز أو مجموعة الايعازات أو الدالات،
    عندها يمكنك تحديد ذلك الرقم مستخدماَ مفردة
    for الخاصة
    بإجراء حلقة تكرارية، وللعلم يجب ان يكون العدد صحيح
    integer، حيث لن تستطيع عمل خمس دورات ونص!

    كود HTML:
    [2]
    int x;
    for (x = 1; x <= 10; x++)
    {
    NSLog(@”Julia is a pretty actress.”);
    }
    NSLog(@”The value of x is %d”, x);


    في المثال [
    2] ،سيتم طباعة سلسلة حروف محددة في [ 1.4 ] عدد
    ١٠ مرات. تم اولا انشاء متغير باسم x واسندت له قيمة مقدارها
    واحد. سيقوم الحاسب بتقييم القيمة ويفاضلها مع المعادلة
    => x
    10 التي تشترط ان تكون قيمة x اقل أو تساوي ١٠ .
    يستوفي هذا الاشتراط تحقيقة وتظل حلقة التكرار تحدث متى
    ماكانت قيمة اقل او تساوي
    ١٠ ( x <= 10 )، هذا الشرط متحقق
    حيث ان قيمة
    x تساوي ١ وهي اقل من ١٠ وسيظل امر التكرار
    قيد العمل.
    اثناء اتمام كل دورة للحلقة سيتم زيادة قيمة المتغير
    x بنسبة عددية
    تساوي
    ١ وذلك لوجود العداد ++ x الذي يؤدي لزيادة قيمة x
    بكل دورة.
    لاحقاَ ستصبح قيمة المتغير
    x مساوية للعدد ٢ وسيتم عمل تقييم
    للمفاضلة بين القيمة والمعادلة المحددة لشرط تكرارية الحلقة والتي
    ستظل تعمل حتى يتحقق الشرط وهو ان تكون قيمة
    x اقل أو
    تساوي
    ١٠ . فما ان تصل قيمة المتغير x الى ١١ عندها يكون
    الشرط بالمعادلة قد تحقق، وبذلك يتم الخروج من حلقة التكرار.
    اخر ايعاز يضمن لك ان تكون قيمة
    x مساوية ل ١١ وليس ١٠
    وهنا تنتهي الحلقة التكرارية.
    في بعض الاحيان قد ترغب بمعدل زيادة اكبر في الخطوات من
    قيمة
    ١ حيث استخدمنا ++ x لزيادتها. كل ما عليك عمله هو
    تغيير خطوات الزيادة
    ” steps “ بصيغة المعادلة في خانة الخطوات.
    المثال التالي[
    2] يقوم بتغيير القيم من درجات مئوية الى درجات
    فهرنهايت.

    كود HTML:
    [3]
    floatcelsius,tempInFahrenheit;
    for (tempInFahrenheit = 0; tempInFahrenheit 
    <= 200; tempInFahrenheit =
    tempInFahrenheit + 20)
    {
    celsius = (tempInFahrenheit - 32.0) * 5.0 
    / 9.0;
    NSLog(@”%10.2f -> %10.2f”, 
    tempInFahrenheit, celsius);
    }

    وخرج البرنامج سيكون:

    كود HTML:
    0.00 -> -17.78
    20.00 -> -6.67
    40.00 -> 4.44
    60.00 -> 15.56
    80.00 -> 26.67
    100.00 -> 37.78
    120.00 -> 48.89
    140.00 -> 60.00
    160.00 -> 71.11
    180.00 -> 82.22
    200.00 -> 93.33


    بالإضافة إلى
    for..loop تقدم لك Objective-C طرق اخرى لعمل
    حلقات التكرار من خلال المفردات:

    كود HTML:
    while () { }

    وأيضاَ
    كود HTML:
    do {} while ()


    إن الايعاز الاخير مشابة جداَ لحلقة
    for-loop . فهذا الأيعاز do
    () while {} يبدأ عمله بتقييم القيمة قيد النظر. طالما كانت
    نتيجة التقييم غير-صحيحة تظل الحلقة تدور حتى يتم استيفاء
    الشرط.

    كود HTML:
    [4]
    int counter = 1;
    while (counter <= 10)
    {
    NSLog(@”Julia is a pretty actress.\n”);
    counter = counter + 1;
    }
    NSLog(@”The value of counter is %d”,
     counter);


    في هذه الحالة، ستكون قيمة المتغير
    counter تساوي ١١ ، فهل
    من اهمية لها بعد ذلك في البرنامج؟ -الامر عائد اليك..
    ان استخدام ايعاز حلقة
    () do {} while يعطي الفرصة لتنفيذ
    للشفرة البرمجية ما بين الاقواس المعقوفة مرة واحدة على الاقل.

    كود HTML:
    [5]
    int counter = 1;
    do
    {
    NSLog(@”Julia is a pretty actress.\n”);
    counter = counter + 1;
    }
    while (counter <= 10);
    NSLog(@”The value of counter is %d”, counter);


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

    (GUI)




    10

    تابع

    التعديل الأخير تم بواسطة للعهد ; 13/04/13 الساعة 06:56 PM

  3. #13
    مراقب منتدى أبل ®Apple الصورة الرمزية للعهد
    تاريخ التسجيل
    Nov 2011
    الدولة
       النمسا
    المشاركات
       2,449
    معدل تقييم المستوى
    881
    نقاط التقييم
                87647
    البرمجة بإستخدام واجهة
    التطبيقات الرسومية

    مع ازدياد خبرة التعامل ب Objective-C سنكون مهيئين لمناقشة
    كيفية إنشاء برنامج مستخدمين فيه ما تقدمة واجهة التطبيقات
    الرسومية (
    GUI ) من خدمات. وعليّ الاعتراف بامر مهم هنا وهو
    ان
    Objective-C لغة برمجية مستقاة من لغة C. فأغلب ما تم
    عرضه حتى الان يعد
    C الصرفه . لذا السؤال الذي يطرح نفسه
    هو مالفرق الذي تشكلة لغة
    Objective-C عن لغة
    C؟
    يكمن الاختلاف في ذلك الجزء المتعلق ب ”
    Objective “. ف
    Objective-C تتعامل مع سمات ومفاهيم مجردة تعرف باسم
    الكائنات
    objects .فحتى هذه اللحظة كنا قد تعاملنا مع الاعداد.
    ولكن كما سترى تتعامل
    Objective-C في الاصل مع الاعداد
    على انها مفاهيم مجردة.
    ذلك انها تمكنك من انشاء تلك الاعداد بالذاكرة وتمكنك من
    تطبيق المعاملات الحسابية عليها بتطبيق مختلف الدالات
    المناسبة بمعاملاتها. ذلك امر رائع عندما يتعامل برنامجك بالارقام (مثل
    الالة الحاسبة). لكن مالعمل عندما يتعامل
    برنامجك على سبيل المثال مع مقطوعات موسيقية
    و مكونات أخرى كلائحة باسماء المقطوعات، ولائحة
    باسماء المغنين؟ أو ان يدير برنامجك على سبيل المثال
    الحركة الجوية كنظام لادارة الطائرات والرحلات والمطارات؟
    الن يكون من الرائع ان تتعامل مع تلك المعطيات من
    خلال
    Objective-C كما لو انك تتعامل مع الاعداد؟
    هنا يأتي دور الكائنات. فمن خلال
    Objective-C يمكنك وضع
    توصيف لنوع الكائن البرمجي الذي ترغب بالتعامل معه، ومن ثم
    تكتب الشفرة البرمجية الملائمة للتعامل والتعاطي معه.
    كمثال على ذلك دعنا نلقي نظرة على نافذة اي برنامج من إنشاء
    Objective-C ، كبرنامج Safari مثلاَ. تفحص نافذة البرنامج
    وانظر لتلك المساحة العلوية من النافذة حيث تجد
    تلك الازرار الثلاثة. ستجد ان الزر الاحمر منها يُغلق النافذة
    بمجرد ضغطك عليه بالفأرة. ترى مالذي يحدث عندما تغلق النافذة
    جراء ضغطك
    لذلك الزر الاحمر؟
    لقد اغلقت النافذة ذاتها لانها تلقت رسالة
    message من ذلك
    الزر الاحمر تفيدها بوجوب اغلاق ذاتها. انها عملية
    رد فعل وتنفيذ لشفرة برمجية داخل النافذة كانت الرسالة هي المسبب
    لتنفيذ ذلك الجزء المتعلق بإغلاق النافذة لذاتها.بإختصار لقد
    تلقت النافذة رسالة تفيدها باغلاق ذاتها.



    النافذة تتلقى رسالة إغلاق


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


    كائن نافذة يحتوى كائنات الازرار

    ان اي كائن (النافذة مثلاَ) يمكنه ان يحتوي على اي كائنات اخرى
    (الازرار الثلاثة). يمكن لبرنامج سفاري ان يزودك باي عدد
    من النوافذ التي تريدها.

    ترى هل كنت تتوقع ان:
    ١. قبام مبرمجي أپل ببرمجة كل تلك النوافذ مسبقاَ مستنفذين كافة
    مواردهم العقلية والحسابية حتى يلبوا طلباتك من النوافذ
    التي قد تحتاجها؟
    ٢. قاموا بوضع نموذج للنافذة ومكنوا برنامج سفاري من استخدام
    ذلك النموذج لانشاء نوافذ اخرى وقت الطلب؟
    قطعاَ الاجابة الثانية هي الصحيحة .
    لقد وضعوا بعض الشفرات البرمجية لتمثل نموذج للنافذة
    حيث حددوا التصرفات والسولكيات العامة الواجب اتباعها لتلك
    النافذة واطلقوا عليها تصنيف أو
    Class.
    فعندما تنشيء نافذة جديدة فانك تعتمد في إنشائك لها على نسخة
    من ذلك التصنيف
    Class الذي يحتوي توصيف للنموذج الاصل
    للنافذة. فالتصنيف
    Class هنا يمثل مفهوم عن النافذة النموذج. مما
    يعني ان اي نافذة تراها امامك انما هي في الواقع مستنسخ
    instance
    من مفهوم النافذة النموذج. (في ذات السياق نستوعب ان العدد
    ٧٦ انما هو مستنسخ من مفهوم تصنيف الاعداد).
    ان النافذة التي قمت بانشاءها تتخذ موقع ومساحة معينة
    منشاشة الماكنتوش. فإذا قمت بتصغيرها إلى المنصة
    Dock ،
    ثم قمت بإستدعائها مرة اخرى سترى انها تعود الى ذات المكان الذي
    كانت متموضعة فيه. يا ترى كيف تعمل هذه الامور؟
    سنرى ان التصنيف الاساسي يعّرف عدد من المتغيرات المناسبة
    والتي تتّحدّد مهمتها بحفظ موقع النافذة من الشاشة.
    ان مستنسخ التصنيف
    class instance ،
    أو الكائن الحالي يحتفظ بتلك القيم التي تخصه
    في متغير اته التي تخضع تحت تصرفه.

    لذا كل كائن نافذة يحتوي متغيرات محددة وبقيم خاصة بذلك
    الكائن. ان عدة كائنات من النوافذ المختلفة يحتفظ كل كائن
    منها بقيم مختلفة لمتغيراتها الخاصة بها.
    هذا التصنيف لم يقم بانشاء كائن النافذة فقط، لكنه
    مكنها منسلسلة من الانشطة والتصرفات (إجراءات
    actions ) التي يمكن
    للنافذة ان تؤديها.
    احد تلك الإجراءات ، إجراء اغلاق النافذة لذاتها
    close .
    فمتى ما قمت بالضغط على ازرار الاغلاق الاحمر باحد النوافذ،
    سيقوم الازرار بارسال رسالة الى النافذة مفادها اغلقي ذاتك.
    ان الإجراءات التي يقوم بها الكائن تسمى
    methods .
    كما ترى انها شديدة الشبة بالدالات ، وذلك لن يشكل مشكلة في التعلم
    والاستخدام اذا كنت متابع معنا حتى اللحظة.
    عندما يقوم النموذج التصنيفي بإنشاء كائن نافذة من اجلك ،
    فإنه في الواقع يحجز جزء من الذاكرة (
    RAM ) كي يتم حفظ موقع
    النافذة من الشاشة، بالاضافة الى عدد من المعلومات الاخرى.
    على كل حال عملية الاستنساخ هذه لا تقوم بنسخ كافة
    الشفرات البرمجية المكونة للنافذة كامر الاغلاق مثلا.
    هذا العمل سيبددحيز كبير من الذاكرة المتاحة حيث سيتم ن
    سخ كافة الشفرات
    البرمجية والإجراءات الخاصة بكل نافذة توجد هنا أو هناك.
    الحل الامثل هو ان توجد الشفرة البرمجية المحددة لسلوكيات
    وتصرفات النافذة بموقع مركزي واحد فقط، حيث يتم مشاركة ومراجعة
    تلك الاوامر والسلوكيات مع اي كائن نافذة آخر ينتمي
    لذلك التصنيف.
    كما أوردنا سابقاَ من امثلة ، ستحتوي الشفرة البرمجية التي
    ستراها في هذا الفصل بعض السطور التي تهتم بحجز مواقع
    الذاكرة وتسريح الحجز حتى يتمكن النظام من استعادتها
    وتوظيفها مرةاخرى. وكما تم التنويه سابقاَ سنتطرق لشرح هذه الاسطر في
    مواضيع متقدمة لاحقاَ. لذا نرجو المعذرة...
    في هذا سنقوم بإنشاء برنامج مكون من ازرارين اثنين وحقل نص
    text field .
    بحيث اذا قمت بالضغط على احد الازرار، سيتم عرض قيمة ما ب حقل النص.
    وعند الضغط على الازرار الاخر سيتم عرض قيمة اخرى بحقل النص.
    فكر في البرنامج وكأنه آله حاسبة
    مكونة من ازرارين ولايمكنها عمل اي عمليات حسابية...
    بمجرد تعلم المزيد يمكنك صنع آلتك الحاسبة بالتأكيد، ولكننا
    نفضل التعلم خطوة خطوة.


    هنا تصور عن البرنامج المزمع انشاءه

    في حال الضغط على احد تلك الازرار، سوف يقوم الازرار
    المضغوط بارسال رسالة. هذه الرسالة تحتوي اسم الاجراء
    method
    المزمع تنفيذه. ترى هذه الرسالة توجه الى من أو ماذا؟
    في حالة النافذة ، كانت رسالة الاغلاق موجهة الى كائن النافذة ،
    والذي بدوره كان مستنسخ
    instance عن تصنيف النافذة اي
    window class . ما نحتاجة الان هو كائن لديه القدرة
    على استقبال الرسائل من اي من هؤلاء الازرارين ، وكذلك القدرة
    لتوجيه حقل النص لعرض قيمة ما.
    لذا في البدء علينا بإنشاء التصنيف الخاصبنا كنموذج،
    ثم نقوم بإستنساخه ككائن. هنا سيكون هذا الكائن هو
    المستقبل للرسائل التي سترسلها اليه تلك الازرار (
    انظر للرسم التوضيحي ادناه).
    ان مستنسخنا عبارة عن كائن برمجي ، مثله مثل كائن النافذة،
    ولكنه على النقيض من كائن النافذة فهذ المستنسخ
    غير ظاهر بصرياَ على الشاشة متى قمنا بتشغيل البرنامج. انه مجرد كائن
    برمجي موجود في ذاكرة الحاسب فقط.
    ما ان يتلقى كائننا المستنسخ تلك الرسالة المرسلة اليه
    من احد تلكا لازرار، سيتم عندها تنفيذ الاجراء المطلوب. والشفرة
    البرمجية لذلك الاجراء ستوجد بالتصنيف النموذجي الاصلي (اي انها
    ليست موجودة بالمستنسخ).
    اثناء التنفيذ، سيقوم هذا الاجراء بارسال رسالة الى كائن
    حقل النص.بالاضافة الى اسم كائن حقل النص، تكون صيغة
    الرسالةالمرسلة محتوية على ما يلي دوماَ: اسم الاجراء (الخاص بحقل
    النص).
    فور تسلم حقل النص للرسالة يتم التنفيذ فوراَ.
    فنحن نريد من حقل النص ان يعرض قيمة نصية معينة ، بناء على الازرار
    المضغوط. لذا ستحتوي الرسالة على مُعامل
    argument (قيمة)
    بالاضافة الى اسم الكائن الذي سترسل اليه الرسالة، واسم الاجراء
    المطلوب تنفيذه حتى يتمكن حقل النصمن القيام بدوره.


    الرسم التوضيحي يوضح عملية تبادل الرسائل بين الكائنات داخل البرنامج.

    هنا نعرض الطريقة العامة لارسال الرسائل ب
    Objective-C دون
    وجود معاملات [
    1.1 ] وبوجودها[ 1.2 ]

    كود HTML:
    [1]
    [receiver message];
    [receiver message:argument];

    كما ترى من الايعازات، يكون القلب النابض للاجراء محصوراَ
    بين تلك الاقواس المربعة
    ;[...] متبوعة بتلك الفاصلة المنقوطة الابدية.
    داخل تلك الاقواس المربعة ، يتم ذكر اسم الكائن المستقبل للرسالة
    اولاَ يتبعه اسم احد الاجراءات التي يمكنه تنفيذها. واذا
    ما تطلب الاجراء وجود اكثر من قيمة او معامل، وجب تزويده بها اجباراَ
    .[
    1.2]

    دعنا نتفحص كيفية عمل ذلك جدياَ.

    شغّل Xcode وانشيء مشروع جديد. اختر نوع تطبيقات Cocoa
    Application المعششة داخل ترويسة التطبيقات Application
    heading.
    اطلق اسم على المشروع (مع مراعاة قواعد التسمية التي تحثك على
    إستخدام حرف كبير
    Capital في بداية اسم التطبيق المستخدم
    للواجهة الرسومية). داخل اطار الملفات والمجموعات ، افتح
    مجلد المصادر
    Resources واضغط متتالياَ على الايقونة المسماة
    MainMenu.nib.




    الضغط المتتالي لفتح الملف MainMenu.nib

    يؤدي الضغط المتتالي على
    MainMenu.nib داخل Xcode
    لتشغيل برنامج آخر يدعى
    Interface Builder واختصاره ،IB
    حيث سيظهر لك نوافذه الخاصة ، يمكنك عندها اخفاء نوافذ التطبيقات
    الاخرى حتى تتمكن من التركيز على ما يتيحه لك
    Interface Builder
    .
    يعرض Interface Builder عدد ٣ نوافذاحدها تسمىWindow
    والتي ستكون النافذة الظاهرة لمستخدمي برنامجك،
    انها كبيرة تقريباَ ، يمكنك تحجيمها. والى يمينها يوجد نافذة يبداء اسمها
    ب
    ”- Cocoa “ . وهي عبارة عن مخزن لكافة انواع الكائنات البصرية
    المتاحة وهذه النافذة تعرف باسم
    palettes window.
    اضغط الايقونة التالية من شريط الأدوات
    Tool Bar باعلى مخزن
    الكائنات، وقم بسحب الايقونة التي تمثل ازرارين اسفل ذلك
    الشريط ثم قم بإفلاتها على النافذة الرئيسة المسماة
    Window.
    اضغط الايقونة التالية من شريط ادوات مخزن الكائنات واسحب
    الكائن الممثل لحقل نص
    text field وكما فعلت سابقاَ قم بسحبها
    وافلاتها الى النافذة الرئيسة. ستجد عندها ان حقل النص قد
    اضاف سلسة الحروف التالية
    ” System Font Text“ الى النافذة
    الرئيسة.


    سحب الكائنات من المخزن الى نافذة التطبيق

    خلف الكواليس، تؤدي عملية السحب والافلات للكائنات-
    الازرار من مخزنها الى النافذة-، تؤدي إلى إنشاء كائن
    ازرارجديد على النافذة. وكذلك الحال مع حقل النص واى كائن آخر
    قابل للسحب والافلات.
    لاحظ ظهور تعليق مقتضب بمجرد ايقاف المؤشر على احد تلك
    الكائنات، تعليقات مثل
    NSButton أو NSTextView . تلك
    التعليقات تمثل اسماء التصنيفات التي تمثلها والتي اعدتها لك
    أپل ، وهي ضرورية لتأدية عدد من العمليات داخل التطبيق.
    قم بترتيب موضع تلك الكائنات داخل نافذتك. وتحجيم ما يلزم.
    قم بتغيير نصوص الازرار، وذلك من خلال الضغط المتكرر على
    الازرار.
    ندعوك لتفحص نافذة مخزن الكائنات حتى تتمرس على عملية
    اضافة الكائنات إلى النافذة.
    لتغيير خصائص
    properties احد الكائنات، اختر الكائن المراد
    تغيير خصائصة وذلك بالضغط على المفاتيح
    command-shift-i.
    ننصحك بتفحصتلك الخصائص ايضاَ.
    كمثال اختر النافذ الرئيسة
    ” Window “ (سوف يتم اعلامك
    بذلك مباشرة من خلال وجود تحديد حول مستنسخ النافذة المبين
    بالنافذة السفلية اليسرى) قم بالضغط على المفاتيح

    command - shift-i
    . تفحص نافذة الخصائص واختر
    "ملامح Attributes " من القائمة
    المنسدلة
    pop-up menu . يمكنك تفعيل ملامح النقشات
    Textured Window التي توفرها النافذة، هذا التفعيل يجعل
    نافذتك تتخذ الشكل المعدني لاظهار ذاتها. ذلك يعني
    امكانية تخصيص العرض البصري لعدد كبير من اجزاء برنامج دون الحاجة
    لكتابة اي سطر برمجي!




    دتفحص نافذتنا من خلال برنامج .IB




    11



    تابع

    التعديل الأخير تم بواسطة للعهد ; 14/04/13 الساعة 09:42 AM

  4. #14
    مراقب منتدى أبل ®Apple الصورة الرمزية للعهد
    تاريخ التسجيل
    Nov 2011
    الدولة
       النمسا
    المشاركات
       2,449
    معدل تقييم المستوى
    881
    نقاط التقييم
                87647
    كما وعدناك سابقاَ،نحن على وشك إنشاء تصنيف class . ولكن
    قبل البدء بذلك دعنا نتفحص ألية عمل تلك التصنيفات.
    فلتوفير الجهود البرمجية، من الافضل دائماَ ان نبني على مابناه الاخرون،
    بدلاَ من البدء من نقطة الصفر لنعيد إختراع الدائرة. فانكنت بحاجة لإنشاء
    نافذة جديدة بخصائص وسلوكيات خاصة مثلاَ، فان كل ما هو مطلوب منك
    هو تزويد الشفرة البرمجية التي توصف تلك الخصائص و السلوكيات.
    ولن تكون ملزماَ لكتابة اي شفرات برمجية لتوصيف عمليات الاغلاق مثلا،
    لانها موجودةَ.
    ان اعتمادك البناء على ما قام الاخرون ببناه يكسبك كافة تلك السلوكيات
    المبنية مجانا دون ادني جهدَ. وذلك ما يجعل
    Objective-C مختلفة اكثر عن لغة C الصرفة.
    كيفيتم ذلك؟
    في الحقيقة، هناك تصنيف للنافذة باسم
    NSWindow ،حيث
    يمكّنك ذلك ان تبني تصنيف خاص بك بحيث يستقى
    (يرثinherits )
    كافة خصائص التصنيف الاول اي
    NSWindow.
    والان لنفترض انك ترغب باضافة سلوك جديد لتصنيفك المبني على
    تصنيف النافذة. مالذي سيحدث لو تلقى تصنيف نافذتنا
    الجديد رسالة الاغلاق ”
    close؟
    فانت لم تقم بكتابة أو بنسخ اي شفرة برمجية تتعامل مع تلك الرسالة.
    الامر بسيط جداَ هنا، فاذا ما تلقى التصنيف الجديد رسالة ما لتنفيذ إحراء معين
    لم نقم بادخال اي شفرة برمجية لمعالجته ،
    عندها سيتم توجيه الرسالة بشكل آلي إلى اي تصنيف اعلى منه
    بسلسلة الوراثة اي التصنيف الذي ورثنا منه خصائص تصنيفنا
    أو ما نطلق عليه(
    superclas).
    عند الضرورة ، يتم اعادة توجية طلب تنفيذ الاجراء باتجاه التصنيف
    الاعلى فالاعلى ، حتى يتم ايجاد ذلك الاجراء وتنفيذه
    من اعلى الهرم المكون منه هذا التصنيف

    (top of the hierarchy of inheritance).

    في حال لم يتم العثور على ذلك الاجراء نكون عندها قد ارسلنا رسالة
    غير قابلة للمعالجة. انه مثل طلبك لعمال ورشة ان يغيروا دواليب
    زلاجتك الثلجية -التي لاتحتوي اي دواليب-. في هذه الحالة حتى مدير الورشة
    لن يستطيع ان
    يقدم لك شيء. تقوم Objective-C في مثل هذه الحالات
    باصدار رسالة خطاء.


    ماذا لو رغبت بتعديل احد السلوكيات أو الاجراءات الموروثة من
    تصنيفك الاب في تصنيفك الحالي؟

    ذلك امر يسير، حيث يمكنك دوماَ تكييف - override - تلك
    الاجراءات. كمثال يمكنك اعادة تكييف الاجراء
    close ، الذي
    يجعل النافذة تخفي ذاتها بصرياَ بحيث يكون إجراء الاغلاق عبارة عن تنحية
    وتغيير لموقع النافذة ثم اغلاقها. ان التصنيف الكائني لنافذتك يستخدم ذات الاسم
    المعرف للاغلاق والذي اعدته لك أپل. لذا ما ان يتم توجيه رسالة
    إجراء الاغلاق لنافذتك، فانها
    سوف تتنحى وتغير موقعها من الشاشة ثم تغلق ذاتها.
    ان عملية اغلاق النافذة لذاتها إجراء مبرمج مسبقاَ من قبل أپل.
    فمن داخل نطاق تعريفنا لذات الاجراء
    close method قمنا
    باستدعاء الاجراء الاصلي للاغلاق وهو الموروث من النموذج
    الاب
    superclass للنافذة. هناك تغييرات طفيفة مطلوبة حتى
    نضمن الايكون هناك تعاودية
    recursive اثناء استدعاء الاجراء.

    كود HTML:
    [2]
    // Code to move the window out of sight
     here.
    [super close]; // Use the close method of 
    the superclass.

    هذا المفهوم البرمجي متقدم جداَ لان يوجد بكتاب للمبتدئين،
    لذا لن نتوقع منك ان تستوعبه ببضعة اسطر خالية من الدسم.
    بالنسبة للكائنات البرمجية، يُعد
    NSObject اصل نشأة ووجود
    باقي الكائنات فمنه يتحدر الجميع ومنه يستقون توصيفاتهم،
    وجميعهم يحتفظون بخصائصه وسلوكياته وراثياَ. انه التصنيف
    الاب لكافة التصنيفات
    subclasses التي ترث منه سواء بشكل
    مباشر أو غير مباشر.كمثال نجد ان التصنيف
    NSWindow
    تصنيف متحدر من سلالة التصنيف
    NSResponder وهذا
    الاخير متحدر من سلالة التصنيف الاب
    NSObject.
    ان التصنيف الاب
    NSObject يوصف افعال متجانسة ومعممة
    داخل الكائنات التي تستقي
    /ترث منه (كإنشاء نص يصف نوعالكائن، أو
    قابلية اجراء
    استفسار ما اذا كان الكائن قادر على تلقي رسالة ما ..الخ)
    قبل ان اضجرك بالعديد من النظريات، دعنا نرى
    كيف يُنشأ التصنيف
    create a class.
    توجة الى نافذة
    MainMenu.nib واختر بند التصنيفاتClasses.
    ستجدرأس الهرم
    NSObject في العمود الاول. اختر هذا التصنيف
    ثم توجه الى القائمة العليا
    menubar حيث تجد قائمة Classes
    menu . ومن هناك اختر تفعيل امر Subclass NSObject ، هذا
    الامر سينشيء تصنيف يرث صفات النموذج الاب. قم بالعودة مرة
    أخرى الى
    MainMenu.nib ، واطلق على التصنيف الجديد اسماَ ذي دلالة،
    عن نفسي اطلقت على التصنيف الجديد اسم
    “MAFoo”
    .



    إن
    شاء تصنيف ” MAFoo class


    ستلحظ وجود حرفين كبيرين
    Capital ضمن اسم مصنفنا ، انهما
    اختزال ابتكرناه للاشارة الى
    ” My Application “. يمكنك اختراع ما تراه
    مناسباَ من الاسماء لمصنفاتك. قبل ان تبدأ العمل بكتابة شفرة برنامجك ننصحك
    بان تتخذ منهج تسمية مشابه. (بمعنى اختيار حرفان أو ثلاثة لتمييز مصنفاتك
    وتجنب ازدواجية تصادم المسميات مع المصنفات الموجودة أو التي يتم
    استعارتها وتضمينها من قبل مبرمجين آخرين).
    على كل حال تجنب استخدم بادئة
    الحرفين
    NS ذلك انها بادئة معتمدة لتصنيفات أپل . وهي اختزال
    لاسم
    NextStep . ف NextStep كان النظام الاساسي الذي يقوم
    عليه نظام
    Mac OS X والذي قامت أپل بشراءه ، وحصلت على
    ستيف جوبز كهدية اضافية فوق العرض.
    موقع دائرة المعلومات المتشاركة
    CocoaDev wiki يحوي قائمة
    بالحروف البادئة
    prefixes التي يجب تجنبها. يجدر بك زيارة
    الموقع متى ما قررت اعتماد بادئة تسميات خاصة بك.

    http://www.cocoadev.com/index.pl?ChooseYourOwnPrex

    متى قمت بإنشاء تصنيف جديد، احرص على اعطاءه اسماَ ذي
    دلالة ومعنى موجز عن دوره. كمثال وكما رأينا في تصنيفات
    Cocoa حيث كان تصنيف النافذة متخذاَ الاسم NSWindow
    . مثال آخر عن تصنيف يختص بإظهار الالوان وهو تحت اسم
    NSColor . في حالتنا يعد اسم التصنيف MAFoo الذي قمنا
    بإنشاءه مجرد مثال لشرح الطريقة التي سيتعامل بها البرنامج
    مع هذا التصنيف. لذا اطلقنا عليه هذا الاسم العبثي دون الدلالة لاي
    دور يقوم به.
    بالعودة الى برنامج
    IB ، قم باختيار إستنساخ Instantiate لعمل
    مستنسخ من تصنيف
    MAFoo الذي ستجده قد اضيف داخل
    قائمة التصنيفات
    Classes menu . ،كما سترى ادنى لويحة
    المستنسخات
    Instances tab ، لديك الان ايقونة جديدة
    باسم
    MAFoo . هذه الايقونة تقوم مقام المستنسخ
    الجديد الذي قمت
    بإنشاءه.


    إنشاء مستنسخ MAFoo

    خطوتنا التالية حول إنشاء توصيلات ما بين الازرار (التي ستقوم
    بارسال الرسالة)الى كائن
    MAFoo (الذي سيتلقى تلك الرسائل).
    بالاضافة الى ذلك، سنقوم بجعل كائن
    MAFoo قادراَ على ارسال
    رسائل موجهة منه شخصياَ الى حقل النص، ذلك ضروري لان
    حقل النص كائن يستقبل الرسائل.
    ان اي كائن غير قادر على التواصل مع الكائنات الاخرى في
    ظل عدم وجود توصيلة مرجعية
    reference تدله على الكائن
    المستقبل.
    عندما نقوم بالتوصيل ما بين الازرار ومصنفنا الكائن
    MAFoo،
    فإننا بذلك نزود الازرار باشارة مرجعية كجسر تواصل تشير للكائن
    MAFoo .
    الازرار هنا سيتمكن من ارسال الرسالة الى
    الكائن
    MAFoo . وبالمقابل كائننا MAFoo سيحتاج لمد جسر
    التواصل مع كائن حقل النص، حتى يتمكن الاخير من تلقي
    الرسالة والامتثال لها.
    دعنا نواكب ما يقوم به البرنامج مرة اخرى. ان كل ازرار من الازارير هنا قادر
    على ارسال رسالة لحدث فريد كرد فعل مثلاَ لضغطة مؤشر
    الماوس الذي تم على ذلك الازرار.
    متى تم ضغط الازرار قام الاخير بارسال رسالة بناء على ذلك الحدث.
    هذه الرسالة تحتوي
    مايلي:
    - اسم الاجراء المراد تنفيذه من التصنيف
    MAFoo الذي سيقوم
    فعلياَ بتنفيذ الامر.
    - هذه الرسالة توجه الى الكائن المستنسخ من التصنيف
    MAFoo
    الذي أنشاءناه مؤخراَ.
    في الحقيقة الكائن المستنسخ
    MAFoo ، لايوجد لديه اي خبر
    حول كيفية تنفيذ الامر المرسل بالرسالة. لكن التصنيف
    MAFoo
    لديه الخبر اليقين
    لذا ما يجري هنا هو ان يتم توجية الرسالة الى الكائن المستنسخ
    MAFoo والذي بدوره سيقوم برفعها الى موصف تصنيفه اي
    MAFoo ومن هناك سيتم توجية تلك الرسالة الى كائن حقل
    النص.
    مثلها مثل اي رسالة، هذه الرسالة مكونة من اسم الاجراء ،
    method
    وهو في هذه الحالة الاجراء الذي يأمر حقل النص بعرض القيمةفي اطاره.
    ان القيمة المرسلة تعد جزء من تكوين الرسالة، بالاضافة
    الى الاسم الذي سينّشط حقل النص لتغيير محتواه.
    لذا تصنيفنا
    MAFoo بحاجة لتعريف إجرائين يطلق عليهما
    actions حيث سيتم استدعائهما من خلال كائني الازرارين.
    وتصنيفنا
    MAFoo بحاجة لتعريف منفذ خرج واحد

    ( outlet).
    ومنفذ الخرج عبارة عن متغير يحتفظ بعنوان الكائن الذي سيتم التواصل معه
    (
    في حالتنا هذه حقل النص هو ذلك الكائن) وذلك
    من خلال ارسال الرسائل اليه.
    تيقن من اختيارك للتصنيف
    MAFoo بلويحة التصنيفات Classes
    tab بالنافذة ذات العنوان
    MainFile.nib.
    ومن خلال لوحة المفاتيح اضغط المفاتيح التالية -
    command-shift
    i حتى تظهر لك نافذة تدقيق الخصائص الخاصة بهذا التصنيف.
    في نافذة تدقيق الخصائص، اختر لويحة الافعال
    Action tab
    واضغط الازرار المعنون ب
    Add حتى يمكنك اضافة الاجراء (يطلق
    عليه
    Action أو method وكلاهما نفس المعنى) الى تصنيفنا .
    قم بتغيير الاسم الافتراضي للإجراء المضاف باسم ذي دلالة وصفية
    مثل
    ”: setTo5 “ -ذلك اننا سنبرمج الفعل ليعرض العدد ٥ كنص
    داخل كائن حقل النص- ثم قم باضافة إحراء آخر وقم بتسميته
    :reset - على سبيل المثال ذلك اننا سنبرمج هذا الاجراء ليعرض
    قيمة صفر بحقل النص-.
    ولاحظ ان كافة الاجراءات المستحدثة هذه تنتهي بنقتطين
    عموديتين
    (”:“). المزيد من المعلومات لاحقاَ.


    إضافة الاجرءات action methods للتصنيف MAFoo

    الان وانت بنافذة تدقيق الخصائص، اختر لويحة الخرج
    Outlet
    tab ، وقم بإضافة مخرج outlet واطلق عليه اسم
    textField
    مثلاَ.




    إضافة مخرجات outlet للتصنيف MAFoo


    11

    تابع

    التعديل الأخير تم بواسطة للعهد ; 14/04/13 الساعة 11:20 AM

  5. #15
    مراقب منتدى أبل ®Apple الصورة الرمزية للعهد
    تاريخ التسجيل
    Nov 2011
    الدولة
       النمسا
    المشاركات
       2,449
    معدل تقييم المستوى
    881
    نقاط التقييم
                87647

    قبل البدء بعمل التوصيلات اللازمة بين الكائنات، يجدر بنا اعطاء
    الازرارين اسماء ذات دلالة. وبما ان الازرار الاول سيقوم
    بالطلب من مستنسخ
    MAFoo ان يعرض العدد ٥ بحقل النص،
    لذا سنقوم بتسمية الازرار
    ” Set to 5 “ -نحن نعلم كيفية عمل
    ذلك من خلال الضغط المتتالي على الازرار ثم تغيير النص
    الى الاسم الجديد-. كرر الامر ذاته مع الازرار الثاني، حيث سنطلق
    عليه اسم
    Reset.

    لاحظ ان عملية تغيير مسميات العناوين التي اجريناها تعدعملية غير
    اساسية لعمل برنامجنا. انها مسألة تتعلق بتعديل الواجهة الرسومية للكائنات
    حتى تكون ذات دلالة وصفية اكبر
    للمستخدم.
    نحن الان جاهزون لمد جسر التواصل بين الكائنات حيث سنعمل
    التوصيلات اللازمة بين كل من:
    ١) توصيل الازرار” Reset “ بمستنسخ MAFoo
    ٢)توصيل الازرار ” Set to 5 “ بمستنسخ MAFoo
    ٣) توصيل المستنسخ MAFoo بحقل النص
    لعمل هذه التوصيلات،اضغط لويحةالمستنسخات
    Instances tab
    بنافذة
    MainFile.nib . ثم بالضغط على مفتاحControl الموجود
    بلوحة المفاتيح استخدم الفأرة لعمل سحب وافلات منطلقاَ من
    ازرار
    Reset الى مستنسخ MAFoo (وانتبه للأ تقم بعكس هذه
    التوصيلة اي ان تنطلق من المستنسخ وتنتهي بالازرار!
    ).
    عندها سيظهر خط بين نقطة الانطلاق ومكعب صغير عند الانتهاء ،
    هذا الخط يمثل التوصيلة التي قمت بعملها. اجعل الخط منطلقاَ
    من الازرار ودعه ينتهي عند مستنسخ
    MAFoo وعندها افلت
    ضغطك من الفأرة .



    توصيل الازرار بكائن MAFoo

    عندما قمت بافلات الضغط عن الفأرة، قام محقق خصائص الازرار
    بعرض التوصيلات في قائمة تعرض الاجراءات
    action methods
    التي تمثل ما يقدمة الكائن
    MAFoo .
    قم باختيار الاجراءد المناسب (اعني ”
    : reset “ ) واضغط على الزر
    Connect لاتمام اجراء عملية التوصيل.




    نفعيل التوصيلات من خلال المحقق .inspector

    الان سترى ان الازرار يحتفظ بعناوين مرجعية موجهة الى الكائن
    MAFoo، هذا الازرار سيقوم بتوجية رسالة الى ذلك الكائن
    MAFoo كلما تم ضغطه. يمكنك الان اجراء التوصيلات التي
    تربط الازرار
    Set to 5 بالكائن MAFoo من اخلال اعادة نفس
    الاجراء السابق.
    ولعمل توصيلات مابين الكائن
    MAFoo وحقل النص، ابداء اولاَ
    بالكائن
    MAFoo ثم اضغط مفتاح control وقم بعملية سحب
    منطلقاَ إلى كائن حقل النص، اضغط الازرار
    Connect وبذلك
    تكون انتهيت من عملية التوصيل.
    ترى ما كل هذا؟ ولماذا؟
    في الحقيقة وكما سترى بعد قليل، انك قد قمت باعمال جنبتك عن كتابة
    أي سطر برمجي، فما قمت به قبل قليل يمكنك عمله
    من خلال عدد لابأس به من اسطر الشفرة البرمجية.
    تأكد من ان مستنسخ
    MAFoo قيد الاختيار بنافذة
    MainMenu.
    nib ثم قم بتحويل عرض البيانات بالضغط على لويحة التصنيفات
    Classes tab . ويفترض انك ترى الان لائحة بكافة التصنيفات
    وسترى ان تصنيفنا
    MAFoo قيد الاختيار حالياَ.
    اختر قائمة
    Classes menu الموجودة بالقائمة العليا، من ثم فعّل
    امر إنشاء ملفات التصنيف
    Create Files for MAFoo . عندها
    سيسألك
    IB عن الموقع الذي سترغب بحفظ ملفاتك قيد الانشاء.
    افتراضياَ هذه الملفات سوف تنشأ داخل مجلد المشروع، وهذا
    العنوان هو بالضبط ما نريده.



    إنشاء الشفرة البرمجية للتصنيف MAFoo

    الان قم بالعودة الى برنامج ،
    Xcode وسوف ترى ان الملفات التي
    أنشأتها موجودةداخل نافذةالمشروع،بمجلدالمصادرالاخرى
    Other
    Sources group . حيث يمكنك سحب هذه الملفات وادراجها
    بمجلد التصنيفات
    Classes group في حال الرغبة، فكما ترى ان
    هذه الملفات الحديثة الإنشاء تمثل توصيف التصنيف
    MAFoo.




    استعراض الملفات المنشاءة داخل .Xcode

    دعنا نعود للوراء قليلاَ، حيث الفصل
    ٤، عندما ناقشنا وظيفة
    الدالات. هل تتذكر نقاشنا حول ترويسة الدالة
    function
    header بالمثال [ 11.1 ]؟ لقد كانت بمثابة تصريح اخباري للمركم،
    تخبرة عما قد يصادفة من اعلانات وتعاريف عن الدوال وانواع
    المعاملات.
    إن احد ملفاتنا المنشاءة مؤخراَ يحمل الاسم
    MAFoo.h وترويسة
    ذلك الملف تحوي المعلومات التي توصّف هذا التصنيف. ففي
    السطر [
    3.5 ] تجد كلمة NSObject المألوفة لديك، والتي تخبرنا
    وتخبر المجّمع ان هذا التصنيف يستقي
    /يرث صفاته من التصنيف
    الاب
    NSObject class.


    كود HTML:
    [3]
    /* MAFoo */
    #import <Cocoa/Cocoa.h> // [3.3]
    @interface MAFoo : NSObject
    {
    IBOutlet id textField; // [3.7]
    }
    - (IBAction)reset:(id)sender;
    - (IBAction)setTo5:(id)sender;
    @end
    سترى ايضاَ [ 3.7 ] وجود منفذ خرج outlet يستخدم حقل النص
    كمعامل -الجديد هنا هو
    ” id “ وهي تعني كائن، أو في الحقيقة
    هي مؤشر للكائن حيث تنوب عنه هنا -.
    ان
    ” IB “ تشير الى Interface Builder ، ذلك البرنامج الذي
    استخدمناه لإنشاء هذه الشفرة البرمجية.
    ستجد ايضاَ كلمات
    IBAction في [ 3.10 , 3.9 ] وهي مماثلة
    للدالات التي لاتقوم بإرجع اي قيمة
    void . ودورها هنا يتمثل
    بارسال الرسالة: فقط و التي لا تتطلب اي رد يليها عند ارسالها
    الى الكائن
    MAFoo.
    سترى ايضاَ عدد اثنين من الاجراءات التي يستخدمها
    IB.
    لقد رأينا سابقاَ مفردة
    import <Foundation/Foundation#
    <h.
    بدلاَ من السطر[3.3 ] . فالمفردة الاولى تستخدم ما يلزم من
    دوال ووظائف للبرامج التي لا تعتمد إستخدام
    إمكانيات ووظائف واجهة التطبيقات الرسومية او
    GUI ، بينما ما تراه الان بالشفرة
    البرمجية يستنفذها استنفاذاَ .
    دعنا الان نتفحص الملف المنُشاء الثاني. انه الملفال مسمى
    MAFoo .
    m . ومرة اخرى حصلنا على سطور وشفرة برمجية مجاناَ دون اي
    تدخل أو عناء من قبلنا.


    كود HTML:
    [4]
    #import “MAFoo.h”
    @implementation MAFoo
    - (IBAction)reset:(id)sender // [4.5]
    {
    }
    // ...Continued
    - (IBAction)setTo5:(id)sender
    {
    }
    @end

    قبل اى شيء ، سوف يتم جلب تصريحات ترويسة الملف
    .MAFooh و ذلك حتى يأخذ المجّمع فرصتة في التعرف عما سيواجهه.
    يوجد مفردتان مألوفتان لنا هنا انها :
    reset و : setTo5 . هذه الاوامر
    هي نفسها الاجراءات
    methods التي حددناها للتصنيف.
    انهاشديدةالشبه بالدالات ذلك انها تتطلب وضع الاوامر محصورة
    بين الاقواس المعقوفة. ففي برنامجنا متى ما تم ضغط احد الازرار،
    سيقوم الازرار المضغوط بارسال رسالة الى الكائن
    MAFoo ،
    تطلب من تنفيد احد تلك الافعال
    methods . الجميل في الموضوع اننا
    غير ملزمين بكتابة اي شفرة برمجية لتحقيق ذلك.
    ان ما قمنا به من اعمال توصيل بين الازرار والكائن
    MAFoo من
    خلال
    IB كان هو كل المطلوب، وقد جنبنا ذلك كتابة هذه السطور
    التي تراها الان. على كل حال علينا كتابة الشفرة البرمجية التي
    ستجعل الكائن
    MAFoo يرسل رسالته إلى حقل النص ليقوم الاخير
    يتغيير القيمة المعروضة كما هو موضح بالاسطر [
    5.12 , 5.7 ].

    كود HTML:
    [5]
    #import “MAFoo.h”
    @implementation MAFoo
    - (IBAction)reset:(id)sender
    {
    [textField setIntValue:0]; // [5.7]
    }
    - (IBAction)setTo5:(id)sender
    {
    [textField setIntValue:5]; // [5.12]
    }
    @end


    كما ترى نحن نرسل الرسالة الى ذلك الكائن المخزن بمنفذ
    الخرج
    outlet الخاص
    بحقل النص
    textField . وبما اننا قد قمنا باعداد التوصيل مابين منفذ
    الخرج وكائن حقل
    النص باستخدام برنامج
    IB ، لذا سيتم توجيه الرسالة الى وجهتها الصحيحة.
    ان اسم الاجراء
    method المستخدم لعملية ارسال الرسالة هو
    :setIntValue وهو يتطلب معامل عددي صحيح Integer . كما
    ان إجراء :
    setIntValue قادر على اظهار القيمة المرفقة معه في كائن
    حقل النص.
    في الفصل التالي سوف نخبرك كيفية اكتشافنا لهذا الايعاز. انت الان
    جاهز لتجميع تجّميع البرنامج وتشغيله. وكما هو معتاد قم
    بالضغط على الازرار
    Build الموجود بشريط الادوات، سيتطلب
    الامر عدة ثوان لبناء وتشغيل البرنامج. في النهاية سينطلق البرنامج
    وتظهر نافذته على الشاشة حتى تتمكن من تجربتة واختباره.


    برنامجنا قيد التشغيل.

    باختصار لقد قمت بإنشاء برنامج بدائي بسيط، وقد تتطلب
    منك كتابة سطرين من الشفرة البرمجية!



    11

    تابع

    التعديل الأخير تم بواسطة للعهد ; 14/04/13 الساعة 12:17 PM

  6. #16
    مراقب منتدى أبل ®Apple الصورة الرمزية للعهد
    تاريخ التسجيل
    Nov 2011
    الدولة
       النمسا
    المشاركات
       2,449
    معدل تقييم المستوى
    881
    نقاط التقييم
                87647
    بحث التعليمات البرمجية
    في الفصل السابق تعرضنا لبعض الاجراءات ، وقد قمنا بكتابة
    اثنان منهما بانفسنا (
    بُنية الاجراء)، لكننا قمنا باستخدام اجراء
    واحد جاهز من قبل أپل . فالاجراء :
    setIntValue كان ذلك الامر
    الموكل بعرض القيمة الرقمية بمحتوى كائن حقل النص. ترى كيف
    تمكنا من معرفة ذلك؟

    هل تذكر ان اي اجراء مقدم اليك من قبل أپل
    لا يتطلب منك كتابة اي شفرة برمجية. بالاضافة الى
    ذلك هذه الاجراءات تضمن لك خلوها من الاخطاء البرمجية.
    لذا تقضي الحكمةان تستثمر بعضاَ من الوقت للتقصي والبحث
    عن تلك الاجراءات المتوفرة لك قبل ان تقوم بكتابة اي سطر برمجي.


    اذا ماقمت باختيار احد الكائنات التي يعرضها لك برنامج
    IB ستجد
    توصيف مقتضب يشير لاسم ذلك التصنيف الذي يقف عنده
    المؤشر ، انه توصيف مختصر جداَ مثل
    NSButton .واذا ما اوقفت
    مؤشر الفأرة فوق كائن حقل النص فانك ستقراء
    NSTextField . ان
    كل اسم من تلك الاسماء يمثل اسم ذلك التصنيف ، دعنا نتفحص
    NSTextField وما يقدمة التصنيف من اجراءات
    methods.

    الاستدلال على الايعازات الاستقصاء عن والاوامر

    توجه الى
    Xcode وستجد بالقائمة العليا menu ، بند قائمة
    المساعدة باسم ،
    Help->Documentation
    اختر
    Cocoa من الاطار الايسر ثم ادخل مفردة NSTextField بحقل
    البحث ، تأكد من اتاحة خيار البحث ان يشمل اجراءات واجهة
    التطبيقات
    API-Search ، (انظر للصورة المرفقة بالاسفل).



    التجوال بين وثائق Cocoa باستخدام .Xcode

    اثناء ادخالاك للمفردة، ستجد ان قائمة نتيجة البحث التي
    تحوي احتمال وجود تلك المفردة قد بدأت بالتقلص، عندها ستجد
    تلك المفردة
    NSTextField قد ظهرت اعلى القائمة. واضغط على
    السطر الذي يشهر مفردة البحث
    NSTextField (وهي هنا من
    نوع تصنيف Class
    ) حتى تحصل على معلومات ذلك التصنيف.
    وسوف يعرض التصنيف معلوماته بالاطار السفلي.
    اول امر نلاحظة هنا هو ان هذا التصنيف مكون بالوراثة منسلسلة
    متصلة من التصنيفات الاخرى. اخر تصنيف في القائمة
    هو الاب ، أو التصنيف الجذر ، انه ملك الهرم
    ! NSObject
    انزل للاسفل قليلاَ (
    scroll ) وستجد ان العنوان الرئيس التالي:
    Method Types
    إبدء بحثك عن الاجراءات تحت هذا العنوان. ان نظرة سريعة على
    العناوين الفرعية تدل على اننا لن نجد ذلك الاجراء الذي نحتاجة
    لعرض تلك القيمة النصية داخل محتوى كائن حقل النص.
    يعود سبب ذلك لمبادىء التوارث بين الكائنات، فنحن بحاجة
    لتفحص التصنيف الاعلى في السلالة
    superclass الذي تكون منه
    تصنيف
    NSTextField ، وهو بطبيعة الحال تصنيف NSControl
    (وفي حال فشلنا في العثور عن ما نبحث عنه سنتوجه الى
    التصنيف الاعلى في السلالة، الا وهو
    NSView ، وهكذا حتى
    نصل الى الجذر الاب ).
    بما ان وثائق المساعدة التوضيحة مكتوبة باستخدام لغة ،
    HTML
    فكل ما علينا عمله الان هو الضغط على كلمة
    NSControl
    (السلالة المتحدرة مرتبة كما هو موضح). تلك الضغطة تنقلنا
    الى الصفحة التي تحوي توصيف
    NSControl.


    كما ترى لقد انتقلنا خطوة للأعلى داخل سلسلة الوراثة. وفي
    العناوين الفرعية للاجراءات سنجد التبويب التالي:

    كود HTML:
    Setting the control’s value


    أو مجموعة إسنادات القيم للتصنيف، وهذه الاجراءات هي
    ما نبحث عنه، اننا نرغب باسناد قيمة. لذا اسفل ذلك العنوان
    الفرعي سنجد:
    كود HTML:
    – setIntValue
    : حتى الان الامور واضحة ، لذا سنتفحص وصف ذلك الاجراء من
    خلال الضغط على الرابط المحيط بكلمة :
    setIntValue .

    الإجراء : setIntValue وصيغته
    كود HTML:
    - (void)setIntValue:(int)anInt
    انه إجراء يقوم بإسناد قيمة عددية anInt داخل خلية (او خلية
    قيد الاختيار
    ). واذا ما كانت الخلية قيد التحرير، عندها سيتم ايقاف كافة
    العمليات قبل
    اتمام عملية الاسناد، ذلك؛ في حال لم تكن الخلية سليلة متحدرة من
    سلسلة
    الوراثة للتصنيفNSActionCell.

    ان هذا الاجراء يقوم بجدولة عملية تحديث عرض قيمة محتوى
    الخلية (
    ان التصنيف NSActionCell يقوم بجدولة اعمال
    التحديث الخاصة بالخلايا التي يمتلكها
    ).
    في برنامجنا نجد ان كائن حقل النص
    NSTextField هو المستقبل
    للرسالة وهو بحاجة لادخال قيمة من نوع عددي صحيح في المعامل
    المستخدم بالاجراء. ويمكننا تبين ذلك بدلالة توقيع الاجراء:

    كود HTML:
    - (void)setIntValue:(int)anInt

    تستخدم
    Objective-C رمز علامة الناقص ”-“ في بداية الاجراءات
    المصرحة كإجراءات تخص الكائن المسستنسخ (وهي التصريحات المقابلة
    بتصريحات التصنيف ذاته ، وسنقوم بتغطية ذلك الموضوع
    لاحقاَ).
    ان مفردة
    void البادئة بهذا الاجراء تعني عدم وجود قيمة مرتجعة.
    بمعنى ان الاجراء :
    setIntValue بالرسالة المرسلة الى حقل النص،
    من قبل المرسل لن تجعل هذا المرسل (
    MAFoodهل تتذكره؟)
    يستقبل اي قيمة راجعة من كائن حقل النص جراء تنفيذ هذا
    الاجراء. هذا هو الطبيعي. فبعد النقطين العموديتين
    ”:“ نلاحظ
    ان معامل الاجراء (
    int ) يشترط ان يكون المتغير المرسل عدد
    صحيح. ففي مثالنا المستخدم، قمنا باسناد قيمة عددية تساوي
    ٥ أو قيمة تساوي صفر، وكلاهما عدد صحيح، لذا نحن نسير
    بشكل سليم.
    في بعض الاحيان يصعب عليك تحديد الاجراء الانسب للاستخدام. لذا قم
    باستشارة ومراجعة مكتبة وثائق المساعدة،
    وتمرن ومارس ما تتعلمه.

    مالعمل عندما ترغب بالاستعلام عن القيمة التي يحتويها
    كائن حقل النص؟

    هل تتذكر ذلك المبدء الجميل الذي يحجب عنك المتغيرات الخاصةبنطاق
    الدالة؟ هذا المبدء ينطبق هنا في حالة الاجراءات. على كل حال غالباَ
    ما ستجد ان الاجراءات تأتي بشكل توأم متلازم، ندعو تلك الاجراءات
    المتلازمة ب
    ” Accessors “، فهناك إجراء خاص
    بالاستعلام عن القيمة، والاخر يختص باسناد تلك القيمة. ولقد
    تعارفنا على الاخير الذي يقوم بالاسناد :
    setIntValue على كل
    حال توأمه المتلازم سيكون مثل ما يلي:

    كود HTML:
    [1]
    - (int) intValue
    كما ترى، هذا الاجراء، يقوم بارجاع قيمة عددية صحيحة.
    لذا متى ما اردنا الاستعلام عن قيمة تلك القيمة العديدة الصحيحة
    المضّمنة داخل كائن حقل النص فاننا سنقوم باستدعاء وتنفيذ
    هذا الاجراء كما يلي:

    كود HTML:
    [2]
    resultReceived = [textField intValue];
    مرة أخرى، كما هو الحال مع وظائف الدوال functions
    (والاجراءات كذلك) ستكون جميع المتغيرات الداخلية بتلك الدوال
    محجوبة ضمن نطاق دوالهّا. هذه ميزة جميلة جداَ لانها تحمي
    اسماء المتغيرات، ولن يعتريك الخوف من اسناد قيمة لمتغير في
    احد اجزاء برنامجك خوفاَ من يؤدي ذلك الاسناد لتغيير قيمة
    متغير آخر يصدف ان يكون بنفس الاسم.
    تدفع
    Objective-C ميزةالحجب هذه شوطاَ ابعد،حيث تشترط ان
    ان تكون اسماء الاجراءات فريدة فقط داخل نطاق التصنيف، لذا
    ستجد عدة تصنيفات مختلفة لديها اجراءات باسماء موحدة.
    هذه ميزة مهمة تلمس قيمتها متى عملت على تطوير
    برامج ضخمة، حيث يتشارك في كتابتها عدة مبرمجين ،
    وكل واحد منهم مسئول عن تصميم التصنيف الذي يراه مناسباَ، دون وجود
    مشاكل تتعلق بتصادم أو إزدواجية باسماء الاجراءات.
    وهناك المزيد من الفائدة. حيث ان حقيقة وجود عدة إجراءات متماثلة
    الاسماء داخل عدة تصنيفات يطلق عليها
    تقنياَ
    polymorphism . وهذه الاخيرة هي ما يجعل البرمجة بالكائنات
    object-oriented programming واختصارها ( OOP ) اسلوباَ
    برمجياَ فريداَ.
    فهذه الميزة تمكنك من كتابة كتل من الشفرات البرمجية دون ان
    يتطلب منك ذلك معرفة مسبقة عن كائن التصنيف أو التصنيفات
    classes التي تتعامل معها.
    ذلك كل ما هو مطلوب، فعند تشغيل البرنامج فعلياَ
    run-time
    ستقوم تلك الكائنات بتفهم واستيعاب الرسائل الموجهة اليها.
    ان الاستفادة من هذه الميزة، تمكنك من كتابة تطبيقات قابلة
    للتعديل والتطوير.
    كمثال، نورد برنامجنا الذي استخدمنا فيه واجهة التطبيقات
    الرسومية ،
    GUI ففي حال اردنا استبدال كائن حقل النص،
    بكائن آخر من فصيلة مختلفة ولكن الاخير يقبل تنفيذ الإجراء
    :
    setInValue ، عندها سيظل برنامجنا يعمل دون الحاجة لتغيير
    اي شفرة برمجية، أو حتى الحاجة لاعادة تركيب البرنامج من
    خلال المجّمع.
    نحن قادرون حتى على تغيير نوع الكائن وقت التشغيل دون ان
    يكون لذلك ضرر على اي قطاع من البرنامج على الاطلاق.
    هنا تكمن القوة والفائدة عند استخدام البرمجة بالكائنات

    (OOP)



    12

    تابع

    التعديل الأخير تم بواسطة للعهد ; 14/04/13 الساعة 07:49 PM

  7. #17
    مراقب منتدى أبل ®Apple الصورة الرمزية للعهد
    تاريخ التسجيل
    Nov 2011
    الدولة
       النمسا
    المشاركات
       2,449
    معدل تقييم المستوى
    881
    نقاط التقييم
                87647
    الاستنهاض من الغفوة

    قامت أپل بعمل الكثير والكثير لتسهل عليك إنشاء برامجك.
    ففي برنامجنا الصغير، لم نكترث لبرمجة النافذة كي ترسم ذاتها على الشاشة،
    ولم يكن مطلوباَ منا كتابة اي سطر برمجي لنشرح للإزرار كيف يرسم ذاته
    على النافذة ، بالاضافة الى امور وتفاصيل
    اخرى. فهذه الاعمال من مسئولية هيكلي عمل
    frameworks

    اثنين هما Foundation Kit framework و. Application Kit
    frameworkالاول Foundation Kit ، هو والذي
    تعاملنا مع وجلبناه في مثالنا[
    12 ] بالفصل ٤، حيث كانت مهمتة
    تزويدنا بخدمات ليس لها
    علاقة بالواجهة الرسومية. والهيكل العملي الثاني
    Application
    Kit ، هو المسؤل المباشر عن اي كائنات رسومية تراها معروضة على
    الشاشة امامك، فهو يحقق العرض والتداول
    user-interaction
    mechanisms . دعنا نعود مرة اخرى الى برنامجنا الذي يعتمد
    واجهة التطبيقات الرسومية
    GUI ، ولنفترض اننا نرغب من برنامجنا ان
    يعرض قيمة معينة بكائن حقل النص ما ان ينطلق البرنامج
    للعمل ويبدأ بعرضن افذته.
    ان جميع المعلومات التي تهتم لها نافذة البرنامج مخزنة بملف
    من امتداد
    nib nib هذه تمثل امتداد مختصر لكلمة Next
    .(
    Interface Builder
    ان في ذلك اشاراة الى ان الاجراء الذي نحتاجة يختص بقطاع
    هيكل العمل
    Application Kit . لذا دعنا نتفحص كيفية حصولنا
    على المعلومات حول هذا الهيكل العملي. ومن خلال ،
    Xcode
    توجه إلى قائمة المساعدة
    Help menu واختر وثائق المساعدة
    .
    Documentation
    في نافذة وثائق المساعدة تأكد من ان خيار بحث كافة النصوص
    Full-Text Search قيد التفّعيل (ولعمل ذلك قم بالضغط على
    ايقونة المكبر بحقل البحث الموجود بتلك القائمة
    ). ثم قم بكتابة
    Application Kit بحقل البحث يليها مفتاح الادخال .Return
    سيقوم
    Xcode بتزويدك بعدة نتائج متنوعة. ومن ضمن هذه
    النتائج ستجد وثيقة باسم
    Application Kit Reference for
    Objective-C . داخل الوثيقة ستجد قائمة من الخدمات التي
    يوفرها هذا الهيكل.
    ستجد تحت العنوان الفرعي للقسم
    Protocols رابط يسمى
    NSNibAwakening.

    الإستنهاض ببروتوكل NSNibAwakening

    انه إجراء للإعلان والتصريح ، يحتوي ما يلي:





    البروتوكول عبارة عن طريقة ذات آلية عمل متفق عليها، فهو
    هنا بروتوكول اعلامي
    informal ، يتكون من إجراء واحد، يتمثل
    ب .
    awakeFromNib
    تقوم التصنيفات بإقحام -
    implement - هذا البروتوكل ليساعدها بتهئية حالتها
    النهائية متى ما تم جلبها من ارشيف الملف الذي
    يخرنها والذي يكون امتداده
    NIB . فمتى ما اقحمنا -
    implement-
    هذاالاجراء،فانه سيكون قيدالتنفيذ لاجراء التهئيةالمناسبة للكائن
    الذي قام باستدعائة وهوفي مرحلةالتحميل من الارشيف.بناء على ذلك
    يمكننا استخدامة لتحقيق هدفنا: اي عرض قيمة افتراضية
    معينة وقت التشغيل.

    نقترح عليك دوماَ ان تجري بحثك وتحوياتك عن الاجراءات الانسب.
    و غالباَ ما يتطلب ذلك قليلاَ من التصفح والاستخدام الخلاق لمفردات
    البحث المستخدمة لتسليط
    الضوء على الاجراء المطلوب.



    لذا من المهم جداَ ان تتألف ببحثك خلال تلك الوثائق حول هذان
    الهيكلان،
    frameworks حتى تتمكن من التعرف على التصنيفات
    التي يقدمانها ، والاجراءات التي سوف تكون تحت تصرفك.
    قد تقرأ عن معلومات ليست بذات اهمية لبحثكا لحالي، ولكنك
    ستكتشف انك تبني قاعدة من المعلومات بمخيلتك سوف يكون
    لها الاثر في سرعة بنائك لبرامجك.
    جميل جداَ، لقد وجدنا الاجراء بعد تسليط الضوء عليه، وكل ماعلينا
    عمله الان هو إضافتة إلى ملف توصيف التصنيف.
    MAFoo
    m كما يلي:

    كود HTML:
    [1]
    #import “MAFoo.h”
    
    @implementation MAFoo
    
    - (IBAction)reset:(id)sender
    {
    
    [textField setIntValue:0];
    }
    
    - (IBAction)setTo5:(id)sender
    {
    
    [textField setIntValue:5];
    }
    
    - (void)awakeFromNib // [1.15]
    {
    
    [textField setIntValue:0];
    }
    
    @end


    متى ما قامت النافذة بعرض ذاتها،سيقوم الاجراء
    awakeFromNib
    بإستدعاء ذاتة إلياَ. وكنتيجة لذلك ، سيُستنهض حقل النص مبكراَ
    ليعرض قيمة تساوي صفر ما ان يكون ظاهراَ لك داخل
    تلك النافذة المفتوحة.




    13

    تابع

    التعديل الأخير تم بواسطة للعهد ; 15/04/13 الساعة 06:00 AM

  8. #18
    مراقب منتدى أبل ®Apple الصورة الرمزية للعهد
    تاريخ التسجيل
    Nov 2011
    الدولة
       النمسا
    المشاركات
       2,449
    معدل تقييم المستوى
    881
    نقاط التقييم
                87647
    المؤشرات

    من واجبنا تحذيرك ان هذا الفصل يحتوي على عدد من المفاهيم
    المتقدمة حول اساسيات لغة
    C والتي قد تُشعر المبتدئين بالضيق
    والتضجر.
    لا تقلق اذا لم تستوعبها الان ولا تجعل الامر يقلقك حيث انه
    ليس متطلب رئيسي لبدء البرمجة بلغة
    Objective-C ، لكن
    التعامل مع المؤشرات له فوائد جمة،
    فعندما تقوم بتعيين وتعريف متغير
    variable ، سيقوم الماكنتوش
    بحجز حيز معين من الذاكرةوذلك لحفظ القيم التي سيحتويها
    هذا المتغير. كمثال على ذلك،
    تفحص الايعاز التالي:


    كود HTML:
    [1]
    int x = 4;

    حتى يتم تنفيذ هذا الايعاز، سيقوم الماكنتوش بالبحث عن مساحة
    غير مستخدمة بالذاكرة. ثم سيقوم بحجز حيز منها حيث يتم
    تخزين قيمة ذلك المتغير
    x، (وبالتأكيد لك مطلق الحرية في
    اختيار اسم المتغير).
    تفحص الايعاز مرة أخرى [
    1] ، وستجد انه يحدد نوع/صنف
    المتغير (
    وهو عددي صحيح هنا ، حتى يتمكن الحاسب من
    تحديد المساحة المطلوبة للحجز والاحتفاظ بقيمة المتغير
    x. لو
    كانت القيمة من نوع عددي كبير أو عدد مزدوج (
    long long or
    double) ، سيتطلب ذلك من الحاسب ان يقوم بحجز حيز اكبر من
    الذاكرة المتاحة.
    إن ايعاز الاسناد
    ” x = 4 “ سيقوم بتخزين قيمة العدد ٤ في ذلك
    الحيز المحجوز من الذاكرة. بالتأكيد سيتذكر الحاسب اين قامبت خزين قيمة
    المتغير
    x من الذاكرة، أو بمعنى آخر إنه يعرف ”عنوان“
    المتغير
    x من الذاكرة ، بهذه الطريقة ، كلما استخدمت المتغير x في
    برنامجك ، سيقوم الحاسب بالبحث في المكان الصحيح (
    العنوان
    الصحيح بالذاكرة
    ) لايجاد القيمة المخزنة الخاصة بالمتغير

    المؤشر ( pointer ) عبارة عن متغير تكون قيمته ”عنوان“
    لمتغير آخر.


    متى ما كان لديك متغير، يمكنك ان تحصل على عنوان موقعه
    بالذاكرة من خلال اضافة الرمز
    & كبادئة اسمية.
    لذا حتى نتحصل على عنوان المتغير
    x، يجب علينا كتابة
    x&.

    كود HTML:
    &x


    عندما يقوم الحاسب بتقييم الايعاز x، فانه سيقوم فوراَ بارجاع قيمة
    ذلك المتغير (في مثالنا السابق كانت قيمة المتغير ترجع القيمة
    العددية
    ٤). وعلى النقيض من ذلك عندما يجري تقييم الايعازx&،
    فإن الحاسب هنا لن يعود لنا بالقيمة المحفوظة للمتغير،
    بل سيعود بالعنوان الذي يوجد به ذلك المتغير من الذاكرة.
    ان العنوانعبارة عن رقم يمثل جزء معين من ذاكرة الحاسب
    (
    مثل الارقام التي تمثل غرف الفندق - وفندقنا هنا مكون من آلاف الآلاف من
    الغرف
    )
    سيتم التصريح عن المؤشر كما يلي:

    كود HTML:
    [2]
    int *y;


    هذا الايعاز يصرح عن ان قيمة المتغير
    y تحتوي عنوان من الذاكرة
    لمتغير آخر من نوع عددي صحيح
    int . ولنقوم بحفظ عنوان المتغير x
    داخل المتغير
    y (نسند عنوان x الى y تقنيناً) نكتب ما يلي:

    [HTML][3]
    y = &x;[/HTML
    ]

    مع وجود المؤشر، يمكنك الوصول الى قيمة ذلك المتغير الذي
    يشير اليه، من خلال اضافة علامة معامل الضرب
    * كبادئة امام
    اسم المتغير (المؤشر). كمثال ، ان تقييم هذا الايعاز

    كود HTML:
    *y
    سيعود بقيمة عددية تساوي ٤. فالايعاز هذا يماثل الايعاز
    المستخدم لتقييم
    ” x“. إن تنفيذ الايعاز

    كود HTML:
    *y = 5

    سيكون مماثلاَ لتنفيذ الايعاز

    كود HTML:
    x = 5

    للمؤشرات فوائدها فقد ترغب في بعض الاحيان ان تشير إلى عنوان
    احد المتغيرات دون الاكتراث للقيمة التي يحتويها ذلك المتغير،
    ان تعين متغير ينوب عن دلك المتغير وقت توجيهك للإيعازات.كمثال،
    لنفرض انك بصدد إنشاء دالة تقوم وظيفتها
    بزيادة قيمة عددية مقدارها
    ١ الى احد المتغيرات ، وهي تستوجب
    معامل يحتوي عنوان ذلك المتغير. وسبب ذلك انها ستقوم بتعديل
    محتوى القيمة المخزنة، وليس فقط استخدامها.
    لذا يتوجب عليك استخدام معامل
    من نوع مؤشر ”
    pointer as argument

    كود HTML:
    [4]
    void increment(int *y)
    {
    *y = *y + 1;
    }
    يمكنك بعد ذلك استدعاء الدالة لتنفيذ ما تقوم به كما يلي:

    كود HTML:
    [5]
    int x = 4;
    increment(&x);
    // now x is equal to 5


    14

    تابع

    التعديل الأخير تم بواسطة للعهد ; 15/04/13 الساعة 12:43 PM

  9. #19
    مراقب منتدى أبل ®Apple الصورة الرمزية للعهد
    تاريخ التسجيل
    Nov 2011
    الدولة
       النمسا
    المشاركات
       2,449
    معدل تقييم المستوى
    881
    نقاط التقييم
                87647

    سلاسل الحروف النصية
    حتى الان تعارفنا على عدة انواع من البيانات مثل: , integer
    long, float, double, BOOL ، وقد تعارفنا مؤخراَ على المؤشرات
    او مايعرف ب
    ، وقد تعارفنا مؤخراَ على المؤشرات
    او مايعرف ب
    pointers.
    وقد تعرضنا سطحياَ لسلاسل الحروف النصية، من خلال
    حديثنا اثناء استخدامها بالدالة
    () NSLog . تلك الدالة التي تمكننا من
    طباعة سلسلة من الحروف على الشاشة، مستبدلين بعض
    المعاملات بواسطة الحروف الخاصة ك
    ”\” أو "%" وعلامة
    d%
    بقيم متنوعة.

    كود HTML:
    [1]
    floatpiValue=3.1416;
    NSLog(@”Here are three examples of strings
     printed to the screen.\n”);
    NSLog(@”Pi approximates %10.4f.\n”, 
    piValue);
    NSLog(@”The number of eyes of a dice is
     %d.\n”, 6);


    لم نتحدث عن سلسلة الحروف كنوع من انواع البيانات سابقاَ،
    والسبب وجيه. وهو ان سلسلة الحروف عبارة عن كائن! وأصله
    في سلالة التحدر بسلسلة التوارث هو التصنيف
    NSString أو
    التصنيف
    NSMutableString .دعنا نتحدث عن هذه التصنيفات
    حيث سنبدأ بالتصنيف
    NSString .

    كود HTML:
    [2]
    NSString *favoriteComputer;
    favoriteComputer = @”Mac!”;
    NSLog(favoriteComputer);
    من المحتمل جداَ ان يكون السطر الثاني مفهوماَ، ولكن السطر
    الاول [
    2.1 ] يستحق بعض التوضيح.
    فهل تتذكر عندما قمنا بالتصريح عن المتغير المؤشر
    pointer-
    -
    variable ، كان علينا حينها تحديد نوع البيانات التي سيشار اليها؟
    اليك الايعاز الذي قمنا به للتصريح عن ذلك، من الفصل
    ١١ [ 2].

    كود HTML:
    [3]
    int *y;

    لقد اعلمنا المجّمع بان متغير المؤشر
    y يحتوي عنوان لحيز من
    الذاكرة. حيث توجد قيمة عددية صحيحة مخزنة هناك.
    في المثال نحن نخبر المجّمع بان المتغير المؤشر هذا يشير الى عنوان
    بحيز الذاكرة حيث يوجد كائن من نوع
    NSString.
    لقد استخدمنا مؤشر ليقوم بالاحتفاظ بتلك السلسلة من الحروف.
    يعود السبب في ذلك لطبيعة
    Objective-C التي تمكنك من
    التعامل مع وتغيير قيمة الكائنات من خلال المؤشرات وليس من
    خلال التعامل المباشر.

    حتى الان كل شيء جميل، لكن مابال ذلك الرمز الغريب@ الذي
    يظهر بين سطور شفرتنا البرمجية من حين
    لآخر؟

    كما تعلم تعد لغة
    Objective-C امتداد متطور من لغة C الاصلية،
    فالقديمة لها طريقتها في التعامل مع النصوص وسلاسل الحروف
    عن الجديدة.
    وحتى يمكننا تبيّن النوع الحديث من النصوص و سلاسل الحروف
    -وهو نوع متطور جداَ-، تقوم باستخدام
    Objective-C هذه
    العلامة
    @ للدلالة على انها من النوع الجديد -تنطق هذه صوتياَ
    بقول
    "At"
    .

    ترى ما التطوير الذي اوجدته
    Objective-C في
    النصوص وسلاسل الحروف عن سابقتها لغة
    C ؟

    اولاَ
    Objective-C تستخدم سلاسل حروف Unicode الشاملة
    بعكس سلاسل حروف
    ASCII المحدودة المستخدمه بلغة
    C.
    ان سلاسل حروف
    Unicode الشاملة تمكنك من عرض اي سلسلة
    نصية بأي لغة حية تتخيلها من كالروسية، الصيني، العربية،
    بالاضافة الى اللاتينية
    Roman alphabet طبعاَ!
    بالتأكيد يمكنك التصريح وتهئية محتوى متغير المؤشر بسلسلة
    نصوص، دفعة واحدة [
    4].

    كود HTML:
    4]
    NSString *favoriteActress = @”Julia”;
    ان متغير المؤشر favoriteActress يشير الى عنوان حيز من الذاكرة
    حيث يوجد ذلك الكائن الذي يمثل ويحتفظ بالسلسة النصية
    “Julia”
    .

    ما ان تنتهي من تهئية المتغير (
    favoriteComputer في مثالنا
    يمكنك عندها إسناد قيمة أخرى اليه، لاحظ انك لن تكون قادر
    على تغيير سلسلة النص ذاتها [
    3] ويعود السبب في ذلك كون
    هذه السلسلة النصية سليلة التصنيف
    NSString بسلسلة الوراثة.
    و سنتحدث عن ذلك خلال دقيقة.الان تابع القراءة...

    كود HTML:
    [5]
    #import <Foundation/Foundation.h>
    int main (int argc, const char *argv[])
    {
    NSAutoreleasePool * pool =
     [[NSAutoreleasePool alloc] init];
    
    NSString *x;
    x = @”iBook”; // [5.7]
    x = @”MacBook Pro Intel”; // Hey, I’m
     just trying to make
    
    // this book look                                        
    up to date!
    NSLog(x);
    [pool release];
    return 0;
    }


    عند تنفيذ هذا البرنامج، سيطبع لك السطر التالي

    MacBook Pro Intel

    ان اي سلسلة حروف من سلالة التصنيف
    NSString تدعى
    immutable، بمعنى انها غير قابلة للتغير والتعديل.
    مالفائدة من وجود سلسلة حروف غير قابلة للتغيير؟
    بصراحة، يكون تعامل النظام مع سلاسل الحروف الغير قابلة للتعديل
    ايسر واسهل، مما يعنى ان برنامجك سيكون اسرع. في
    الواقع سترى اثناء كتابتك للبرامج مستخدماَ
    Objective-C أنك
    غير مضطر لتعديل اي سلسلة حرفية في كثير من الاحيان.
    وبالتأكيد هناك اوقات ستحتاج فيها ان تقوم بتعديل وتغيير سلسلة
    حرفية. لذا تم ايجاد تصنيف خاص يقوم بذلك، حيث
    سيمكنك من تعديل كائن النص بكل يسر وسهولة

    هذا التصنيف معروف باسم . NSMutableString


    وسوف نناقش طريقة التعامل معه لاحقاَ بهذا الفصل.ولكن دعنا اولاَ
    نؤكد لك ان سلاسل الحروف انما هى عبارة عن كائنات.
    ذلك يعني امكانية استقبالها للرسائل.
    كمثال، يمكننا ارسال الرسالة
    length الى كائن سلسلة الحروف
    كما يلي بالمثال[
    6] .

    كود HTML:
    [6]
    #import <Foundation/Foundation.h>
    
    int main (int argc, const char * argv[])
    {
    NSAutoreleasePool * pool =
     [[NSAutoreleasePool alloc] init];
    int theLength;
    NSString * foo;
    // Continued
    foo = @”Julia!”;
    theLength = [foo length]; // [6.10]
    NSLog(@”The length is %d.”, theLength);
    [pool release];
    return 0;
    }


    عند تنفيذ البرنامج، سيطبع لك السطر التالي :

    .
    The length is 6

    يميل المبرمجين لاستخدام مفردتي
    foo و bar كأسماء للمتغيرات
    اثناء شرحهم للمواضيع المتعلقة بالبرمجة.في الواقع تلك المسميات سيئة
    جداَ، يعود السبب في ذلك لكونها غير ذات دلالة فلا معنى، انها مثل استخدامنا
    للمتغير
    x. ولكننا تعرضنا لها هنا حتى لاتشعر بالحيرة من امرك عندما تراها في نقاشات
    ومحاورات الانترنت.
    في السطر [
    6.10 ] قمنا بارسال رسالة length الى الكائن
    foo،
    الرسالة تلك عبارة عن إجراء
    method مصرح عنه باسم length
    في تصنيف
    NSString class كما يلي:

    كود HTML:
    - (unsigned int)length


    انه إجراء يعود بقيمة عددية تمثل إحصاء لعدد الحروف الموجودة بسلسلة
    الحروف. ويمكنك إيضاَ تغيير الحروف الموجودة بالسلسلة
    الى حروف كبيرة
    uppercase.
    ولتحقيق ذلك ارسل الرسالة المناسبة لكائن سلسلة الحروف ،
    نعني بذلك إجراء
    uppercaseString الذي يمكنك البحث عنه
    والاطلاع على طريقة تنفيذه من خلال قراءة وثائق المساعدة معتمداَ
    على نفسك هذه المرة (وتفحص الاجراءات التي يقدمها
    لك تصنيف
    NSString) .

    فور تلقيه للرسالة، يقوم كائن سلسلة الحروف بإنشاء وإرجاع
    كائن سلسلة
    حروف جديد يحوي نفس المحتوى ولكن تم تحويل الان
    كل حرف صغير
    small letter إلى ما يقابلة من الحروف الكبيرة
    Capital Letter.


    كود HTML:
    [7]
    #import <Foundation/Foundation.h>
    
    int main (int argc, const char * argv[])
    {
    NSAutoreleasePool *pool =
    [[NSAutoreleasePool alloc] init];
    
    //...Continued
    NSString *foo, *bar;
    foo = @”Julia!”;
    bar = [foo uppercaseString];
    NSLog(@”%@ is converted into %@.”, foo,
     bar);
    
    [pool release];
    return 0;
    }


    عند تنفيذ البرنامج، سيطبع لك السطر التالي :

    !Julia! is converted into JULIA


    في بعض الاحيان قد ترغب بتغيير محتوى موجود سابقاَ بدلاَ منان تنشء
    محتوى جديد. في مثل هذه الحالة عليك باستخدام
    الكائن الذي يأت من سلالة التصنيف
    NSMutableString حتى
    يتم عرض النص الجديد. فالتصنيف
    NSMutableString يوفر
    لك عدة إجراءات تمكنّك من تعديل محتوى سلسلة الحروف.
    كمثال، تجد أن الإجراء :
    appendString يقوم بإضافة سلسلة
    حروف الى نهاية سلسلة حروف الكائن المستقبل للرسالة.


    كود HTML:
    [8]
    #import <Foundation/Foundation.h>
    
    int main (int argc, const char * argv[])
    {
    NSAutoreleasePool *pool =
     [[NSAutoreleasePool alloc] init];
    
    NSMutableString *foo; 
    // [8.7]
    foo = [@”Julia!” mutableCopy];
     // [8.8]
    [foo appendString:@” I am happy”];
    NSLog(@”Here is the result: %@.”, foo);
    
    [pool release];
    return 0;
    }


    عند تنفيذ البرنامج، سيطبع لك السطر التالي :

    .
    Here is the result: Julia! I am happy

    ففي السطر [
    8.8 ] ، قام الاجراء mutableCopy (وهو من الاجراءات
    التي يقدمها لك تصنيف
    NSString ) بإنشاء وإرجاع سلسلةحروف غير قابلة
    للتعديل بنفس محتوى سلسلة الحروف الكائن
    المستقبل. وذلك بعد الانتهاء من تنفيذ اوامر السطر [
    8.8 ] ، حيث
    كان المتغير
    foo مشيراَ الى سلسلة حروف غير قابلة للتعديل كانت
    تحتوى
    ”! Julia.
    في بداية فصلنا هذا اوضحنا الا يكون هناك اي تعامل مع كائنات
    Objective-C بشكل مباشر. وان اي عمليات تداول أو تعامل مع
    الكائنات يتم من خلال المؤشرات. واليك سبب ذلك ،فنحن قد استخدمنا
    متغير مؤشر بالسطر [
    8.7 ]. في الواقع عندما استخدمنا
    مفردة
    ”كائن- object “ إنما عنينا بذلك ”مؤشر للكائن pointer
    “to an object.
    وطالما اننانستخدم الكائنات بالمؤشرات دوماَ، فقداستخدمنا كلمة
    ”كائن- object “ إختصاراَ. ان حقيقة التعامل مع الكائنات من
    خلال المؤشرات له جانب آخر ، ومن المهم جداَ استيعابه:

    يمكن لعدة متغيرات ان تكون ممثلة - -reference
    لكائن من الكائنات في وقت واحد.


    15


    تابع

    التعديل الأخير تم بواسطة للعهد ; 15/04/13 الساعة 08:07 AM

  10. #20
    مراقب منتدى أبل ®Apple الصورة الرمزية للعهد
    تاريخ التسجيل
    Nov 2011
    الدولة
       النمسا
    المشاركات
       2,449
    معدل تقييم المستوى
    881
    نقاط التقييم
                87647

    كمثال، بعد ان تم تنفيذ السطر [ 8.7 ] ، اصبح متغير المؤشرfoo
    مُمثلاَ لكائن يحتوي سلسلة الحروف المكونة لكلمة
    Julia!
    !هذه الامر يمكن تجسيدة على الصورة التالية:




    التعامل والتداول مع الكائنات يتم من خلال المؤشرات دوماَ.


    الان لنفترض اسنادنا قيمة المتغير
    foo الى المتغير bar كما يلي:


    كود HTML:
    bar = foo;


    نتيجة هذا الايعاز، ان كلا المتغيران سيشيران الى نفس الكائن.





    يمكن لعدة متغيرات ان تشير الى نفس الكائن.


    في هذه الحالة، عندما نرغب بارسال رسالة الى الكائن
    من خلال المؤشر
    foo (كأن نقول;[ foo dosomething ] )
    سيكون الاثر ذاتة كما لو قمنا باستخدام
    bar كأن

    نقول;[bar dosomething])

    وهذا الامر موضح بهذا المثال:

    كود HTML:
    [9]
    #import <Foundation/Foundation.h>
    
    int main (int argc, const char * argv[])
    {
    NSAutoreleasePool *pool =
     [[NSAutoreleasePool alloc] init];
    
    NSMutableString *foo = [@”Julia!” 
    mutableCopy];
    NSMutableString *bar = foo;
    
    NSLog(@”foo points to the string: %@.”, 
    foo);
    NSLog(@”bar points to the string: %@.”,
     bar);
    NSLog(@”------------------------------”);
    
    [foo appendString:@” I am happy”];
    
    NSLog(@”foo points to the string: %@.”,
     foo);
    NSLog(@”bar points to the string: %@.”, 
    bar);
    
    [pool release];
    return 0;
    }


    عند تنفيذ البرنامج، سيطبع لك ما يلي :

    foo points to the string: Julia!
    bar points to the string: Julia!
    ------------------------------
    foo points to the string: Julia! I am happy
    bar points to the string: Julia! I am happy


    ان تكون لك القدرة على تمثيل (او الاشارة الى) نفس الكائن
    منعدة اماكن، ذلك يعد ميزة من اهم مميزات البرمجة بالكائنات.
    في الواقع لقد قمنا باستخدام هذه الخاصية في الفصول السابقة.
    ففي الفصل
    ٨ مثلاَ، قمنا بتمثيل الكائن MAFoo من خلال
    كائني الازرارين.


    15


    تابع

    التعديل الأخير تم بواسطة للعهد ; 15/04/13 الساعة 08:10 AM

صفحة 2 من 4 الأولىالأولى 1234 الأخيرةالأخيرة

معلومات الموضوع

الأعضاء الذين يشاهدون هذا الموضوع

الذين يشاهدون الموضوع الآن: 1 (0 من الأعضاء و 1 زائر)

المواضيع المتشابهه

  1. برنامج البرمجة بلغة C# IDE Mobile 12.0
    بواسطة al hassar في المنتدى قــســم التــطــبـيـقــــات
    مشاركات: 2
    آخر مشاركة: 13/12/08, 01:11 PM
  2. *.* حصريا المرجع الكامل لتعريب برامج S60.. شرح بالــصــور *.*
    بواسطة mobile fon في المنتدى قسم التطبيقات والألعاب (سمبيان&آشا)
    مشاركات: 145
    آخر مشاركة: 06/11/07, 10:48 PM
  3. المرجع الكامل للعبة Semis الكامل
    بواسطة الشمالي في المنتدى القسم العام (سمبيان&آشا)
    مشاركات: 13
    آخر مشاركة: 21/06/04, 04:37 PM

الكلمات الدلالية لهذا الموضوع

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •