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;
}