Objective-C هي لغة برمجة كائنية التوجه تُستخدم بشكل رئيسي لتطوير تطبيقات macOS وiOS. تعتمد على لغة C مع إضافة مفاهيم البرمجة الكائنية مثل الفئات والرسائل. هذه الدورة ستأخذك في رحلة شاملة لتعلم Objective-C من الأساسيات إلى المفاهيم المتقدمة مع أمثلة عملية.
Objective-C هي لغة برمجة تم تطويرها في الثمانينيات وأصبحت أساس تطوير تطبيقات Apple.
                            #import 
                            int main(int argc, const char * argv[]) {
                                @autoreleasepool {
                                    NSLog(@"مرحبًا بالعالم!");
                                }
                                return 0;
                            }
                         
                    الفئات هي القوالب التي تُنشئ منها الكائنات في Objective-C.
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;
                            }
                         
                    الخصائص تُستخدم لإدارة البيانات داخل الفئات مع تحكم في الوصول.
                            #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 لإدارة الذاكرة تلقائيًا، مع خيار الإدارة اليدوية.
retain وrelease (قديم).
                            #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;
                            }
                         
                    البروتوكولات تُحدد مجموعة من الوظائف التي يجب تطبيقها.
@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;
                            }
                          
                    الكتل هي دوال مجهولة تُستخدم كبديل للمعاملات أو الردود.
^.
                            #import 
                            int main() {
                                @autoreleasepool {
                                    void (^sayHello)(NSString *) = ^(NSString *name) {
                                        NSLog(@"مرحبًا، %@", name);
                                    };
                                    sayHello(@"علي");
                                }
                                return 0;
                            }
                         
                    الوراثة تسمح بتوسيع الفئات الأساسية.
                            #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;
                            }
                         
                    هياكل بيانات لتخزين مجموعات من العناصر.
                            #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.
                            #import 
                            int main() {
                                @autoreleasepool {
                                    @try {
                                        NSArray *array = @[@"item"];
                                        [array objectAtIndex:5]; // خطأ خارج النطاق
                                    }
                                    @catch (NSException *exception) {
                                        NSLog(@"خطأ: %@", exception);
                                    }
                                    @finally {
                                        NSLog(@"تم التنفيذ");
                                    }
                                }
                                return 0;
                            }
                         
                    توسيع الفئات الموجودة دون تعديلها.
                            #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;
                            }
                         
                    تنفيذ مهام متعددة في وقت واحد.
                            #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;
                            }
                         
                    إطار عمل يوفر أدوات أساسية للتعامل مع البيانات.
                            #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;
                            }