شرح دورة Objective-C

Objective-C هي لغة برمجة كائنية التوجه تُستخدم بشكل رئيسي لتطوير تطبيقات macOS وiOS. تعتمد على لغة C مع إضافة مفاهيم البرمجة الكائنية مثل الفئات والرسائل. هذه الدورة ستأخذك في رحلة شاملة لتعلم Objective-C من الأساسيات إلى المفاهيم المتقدمة مع أمثلة عملية.

الدرس الأول: مقدمة في Objective-C

Objective-C هي لغة برمجة تم تطويرها في الثمانينيات وأصبحت أساس تطوير تطبيقات Apple.

شرح مفصل:
  • الأساس: تعتمد على C مع إضافة ميزات كائنية.
  • الاستخدام: تطوير تطبيقات iOS وmacOS باستخدام إطار عمل Cocoa.
  • البنية: ملفات .h (واجهة) و.m (تطبيق).
مثال:
#import int main(int argc, const char * argv[]) { @autoreleasepool { NSLog(@"مرحبًا بالعالم!"); } return 0; }

الدرس الثاني: الفئات والكائنات

الفئات هي القوالب التي تُنشئ منها الكائنات في Objective-C.

شرح مفصل:
  • @interface: تعريف الفئة (الخصائص والوظائف).
  • @implementation: تنفيذ الوظائف.
  • إنشاء الكائنات: باستخدام alloc وinit.
مثال:
#import @interface Person : NSObject - (void)sayHello; @end @implementation Person - (void)sayHello { NSLog(@"مرحبًا، أنا شخص!"); } @end int main() { @autoreleasepool { Person *person = [[Person alloc] init]; [person sayHello]; } return 0; }

الدرس الثالث: الخصائص (Properties)

الخصائص تُستخدم لإدارة البيانات داخل الفئات مع تحكم في الوصول.

شرح مفصل:
  • @property: تعريف الخاصية مع سمات (مثل strong، weak).
  • nonatomic: تحسين الأداء في بيئة غير متعددة الخيوط.
  • الوصول: باستخدام النقطة (dot syntax) أو الرسائل.
مثال:
#import @interface Car : NSObject @property (nonatomic, strong) NSString *brand; @property (nonatomic, assign) int year; @end @implementation Car @end int main() { @autoreleasepool { Car *myCar = [[Car alloc] init]; myCar.brand = @"Toyota"; myCar.year = 2020; NSLog(@"السيارة: %@، السنة: %d", myCar.brand, myCar.year); } return 0; }

الدرس الرابع: الرسائل والوظائف

الرسائل هي طريقة استدعاء الوظائف في Objective-C.

شرح مفصل:
  • الصيغة: [object method].
  • معاملات: يمكن إضافة معاملات متعددة باستخدام النقاط.
  • الإرجاع: تحديد نوع القيمة المرجعة.
مثال:
#import @interface Calculator : NSObject - (int)addNumber:(int)a toNumber:(int)b; @end @implementation Calculator - (int)addNumber:(int)a toNumber:(int)b { return a + b; } @end int main() { @autoreleasepool { Calculator *calc = [[Calculator alloc] init]; int result = [calc addNumber:5 toNumber:3]; NSLog(@"النتيجة: %d", result); } return 0; }

الدرس الخامس: إدارة الذاكرة

Objective-C يستخدم ARC لإدارة الذاكرة تلقائيًا، مع خيار الإدارة اليدوية.

شرح مفصل:
  • ARC: Automatic Reference Counting لتحرير الكائنات بدون مراجع.
  • Manual Retain-Release: استخدام retain وrelease (قديم).
  • ضعف المراجع (weak): تجنب دورات الاحتفاظ (retain cycles).
مثال:
#import @interface Example : NSObject @property (nonatomic, strong) NSString *data; @end @implementation Example @end int main() { @autoreleasepool { Example *ex = [[Example alloc] init]; ex.data = @"بيانات"; NSLog(@"%@", ex.data); // ARC يحرر ex تلقائيًا } return 0; }

الدرس السادس: البروتوكولات (Protocols)

البروتوكولات تُحدد مجموعة من الوظائف التي يجب تطبيقها.

شرح مفصل:
  • التعريف: باستخدام @protocol.
  • إلزامي/اختياري: @required و@optional.
  • التطبيق: إضافته بين <> في تعريف الفئة.
مثال:
#import @protocol Movable @required - (void)move; @optional - (void)stop; @end @interface Robot : NSObject @end @implementation Robot - (void)move { NSLog(@"الروبوت يتحرك"); } @end int main() { @autoreleasepool { Robot *robot = [[Robot alloc] init]; [robot move]; } return 0; }

الدرس السابع: الكتل (Blocks)

الكتل هي دوال مجهولة تُستخدم كبديل للمعاملات أو الردود.

شرح مفصل:
  • التعريف: باستخدام ^.
  • الاستخدام: تمريرها كمعاملات أو تخزينها.
  • المتغيرات: يمكنها التقاط المتغيرات المحلية.
مثال:
#import int main() { @autoreleasepool { void (^sayHello)(NSString *) = ^(NSString *name) { NSLog(@"مرحبًا، %@", name); }; sayHello(@"علي"); } return 0; }

الدرس الثامن: الفئات الفرعية والوراثة

الوراثة تسمح بتوسيع الفئات الأساسية.

شرح مفصل:
  • الفئة الأم: المصدر.
  • الفئة الفرعية: ترث وتضيف وظائف جديدة.
  • تجاوز (Override): إعادة تعريف الوظائف.
مثال:
#import @interface Animal : NSObject - (void)speak; @end @implementation Animal - (void)speak { NSLog(@"صوت حيوان"); } @end @interface Dog : Animal @end @implementation Dog - (void)speak { NSLog(@"ووف!"); } @end int main() { @autoreleasepool { Dog *dog = [[Dog alloc] init]; [dog speak]; } return 0; }

الدرس التاسع: المصفوفات والقواميس

هياكل بيانات لتخزين مجموعات من العناصر.

شرح مفصل:
  • NSArray: قائمة غير قابلة للتعديل.
  • NSMutableArray: قائمة قابلة للتعديل.
  • NSDictionary: مفاتيح وقيم.
مثال:
#import int main() { @autoreleasepool { NSArray *colors = @[@"أحمر", @"أزرق"]; NSLog(@"اللون الأول: %@", colors[0]); NSMutableArray *numbers = [NSMutableArray array]; [numbers addObject:@1]; [numbers addObject:@2]; NSLog(@"الأرقام: %@", numbers); NSDictionary *person = @{@"name": @"علي", @"age": @25}; NSLog(@"الاسم: %@", person[@"name"]); } return 0; }

الدرس العاشر: التعامل مع الأخطاء

إدارة الأخطاء باستخدام NSError أو try-catch.

شرح مفصل:
  • NSError: تمرير كائن للأخطاء عبر المعاملات.
  • @try/@catch: معالجة الاستثناءات مباشرة.
مثال:
#import int main() { @autoreleasepool { @try { NSArray *array = @[@"item"]; [array objectAtIndex:5]; // خطأ خارج النطاق } @catch (NSException *exception) { NSLog(@"خطأ: %@", exception); } @finally { NSLog(@"تم التنفيذ"); } } return 0; }

الدرس الحادي عشر: الكاتيجوري والإكستنشن

توسيع الفئات الموجودة دون تعديلها.

شرح مفصل:
  • Category: إضافة وظائف لفئة موجودة.
  • Extension: إضافة وظائف خاصة داخل الفئة.
مثال:
#import @interface NSString (Reverse) - (NSString *)reverseString; @end @implementation NSString (Reverse) - (NSString *)reverseString { NSMutableString *reversed = [NSMutableString string]; for (NSInteger i = self.length - 1; i >= 0; i--) { [reversed appendFormat:@"%C", [self characterAtIndex:i]]; } return reversed; } @end int main() { @autoreleasepool { NSString *text = @"مرحبًا"; NSLog(@"%@", [text reverseString]); } return 0; }

الدرس الثاني عشر: التعددية المتزامنة (Concurrency)

تنفيذ مهام متعددة في وقت واحد.

شرح مفصل:
  • GCD: Grand Central Dispatch لإدارة الخيوط.
  • Queues: تنظيم المهام في طوابير.
مثال:
#import int main() { @autoreleasepool { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ NSLog(@"مهمة في الخلفية"); }); NSLog(@"مهمة في المقدمة"); } sleep(1); // للسماح برؤية النتيجة return 0; }

الدرس الثالث عشر: إطار عمل Foundation

إطار عمل يوفر أدوات أساسية للتعامل مع البيانات.

شرح مفصل:
  • NSString: للنصوص.
  • NSNumber: للأرقام.
  • NSDate: للتواريخ.
مثال:
#import int main() { @autoreleasepool { NSNumber *num = @42; NSDate *now = [NSDate date]; NSLog(@"الرقم: %@, التاريخ: %@", num, now); } return 0; }

الدرس الرابع عشر: تطبيق عملي

إنشاء تطبيق بسيط يجمع المفاهيم السابقة.

شرح مفصل:
  • مثال: برنامج لإدارة قائمة مهام.
مثال:
#import @interface Task : NSObject @property (nonatomic, strong) NSString *title; @property (nonatomic, assign) BOOL completed; - (void)markAsCompleted; @end @implementation Task - (void)markAsCompleted { self.completed = YES; NSLog(@"المهمة %@ تم إكمالها", self.title); } @end int main() { @autoreleasepool { NSMutableArray *tasks = [NSMutableArray array]; Task *task1 = [[Task alloc] init]; task1.title = @"كتابة الكود"; [tasks addObject:task1]; Task *task2 = [[Task alloc] init]; task2.title = @"اختبار التطبيق"; [tasks addObject:task2]; for (Task *task in tasks) { [task markAsCompleted]; } } return 0; }