Objective-C — 1980-yillarda Bred Koks tomonidan yaratilgan dinamik xabar jo'natishga ega dasturlash tili. Apple NeXTSTEP, keyin esa iOS SDK uchun asosiy til sifatida Objective-C ni tanladi. Programming With Objective-C — xabar sintaksisi va xotira boshqaruviga kirish.
Asosiy
Objective-C — C ni Smalltalk uslubidagi ob'ektga yo'naltirilgan dasturlash imkoniyatlari bilan kengaytiruvchi dasturlash tili. Objective-C kodi LLVM yoki GCC orqali nativ mashina kodiga kompilyatsiya qilinadi, C bilan to'liq orqaga moslikni saqlaydi — har qanday C kodi Objective-C da to'g'ri.
Apple 1997 yilda NeXT ni (Objective-C bilan birga) sotib oldi. Til macOS uchun Cocoa va Cocoa Touch — iOS uchun framework-larning asosiga aylandi. 2014 yildan boshlab Apple Swift ni o'rinbosar sifatida targ'ib qilmoqda, ammo Objective-C legacy loyihalar va ba'zi tizim framework-lari uchun muhim bo'lib qolmoqda. Apple ma'lumotlariga ko'ra (WWDC 2024), App Store dagi ilovalarning taxminan 35 foizi hali ham Objective-C kodini o'z ichiga oladi.
Asosiy xususiyat — dinamik runtime. Swift dan farqli o'laroq, unda metod chaqiruvlari kompilyatsiya bosqichida hal qilinadi, Objective-C objc_msgSend funksiyasi orqali bajarish vaqtida xabarlar yuboradi. Bu metodlarni uchish vaqtida qayta belgilash (method swizzling), sinflarni dinamik qo'shish va mavjud bo'lmagan selektorlar uchun forward invocation dan foydalanish imkonini beradi.
Har qanday C kodi Objective-C da to'g'ri. Ob'ekt qo'shimchasi sinflar (@interface/@implementation), kategoriyalar, protokollar (@protocol) va dinamik tiplash (id) qo'shadi. Fayllar .m (implementatsiya) va .h (sarlavhalar) kengaytmalariga ega.
Xabar sintaksisi — Objective-C ning C-ga o'xshash tillardan asosiy farqi. object.method(argument) o'rniga [object method:argument] ishlatiladi. Har bir xabar objc_msgSend orqali o'tadi, u runtime da metod implementatsiyasini dinamik qidiradi.
// Nomlangan parametrlar bilan xabar sintaksisi
NSString *greeting = [NSString stringWithFormat:@"Hello, %@", name];
// Ichma-ich xabarlar
NSArray *sortedArray = [[array sortedArrayUsingSelector:@selector(compare:)] copy];
// Introspeksiya orqali tur tekshiruvi
if ([object isKindOfClass:[UIView class]]) {
UIView *view = (UIView *)object;
view.backgroundColor = [UIColor redColor];
}Dynamic dispatch metodlarni runtime da qayta belgilash (method swizzling) imkonini beradi — kuchli, ammo xavfli texnika. Masalan, AFNetworking va Aspects kabi framework-lar URLSession chaqiruvlarini tutib olish uchun swizzling dan foydalanadi. Apple ogohlantiradi: swizzling noto'g'ri ishlatilganda tizim framework-larining ishini buzishi mumkin.
Categories — Objective-C ning mavjud sinflarga (shu jumladan, NSString va UIView kabi tizim sinflariga) merossiz va manba kodiga kirmasdan metod qo'shish uchun noyob imkoniyati. Kategoriyalar @interface ClassName (CategoryName) orqali e'lon qilinadi.
// UIColor+Hex.h fayli — UIColor uchun kategoriya
@interface UIColor (Hex)
+ (instancetype)colorWithHex:NSUIntegerhex;
@end
// UIColor+Hex.m fayli — implementatsiya
@implementation UIColor (Hex)
+ (instancetype)colorWithHex:NSUIntegerhex {
CGFloat r = ((hex >> 16) & 0xFF) / 255.0;
CGFloat g = ((hex >> 8) & 0xFF) / 255.0;
CGFloat b = (hex & 0xFF) / 255.0;
return [self colorWithRed:r green:g blue:b alpha:1.0];
}
@endExtensions (Class Extension) — .m faylida nomsiz e'lon qilingan maxsus kategoriya turi: @interface ClassName (). Kategoriyalardan farqli o'laroq, extensions nafaqat metodlarni, balki ivar (o'zgaruvchi misollari) va property ni ham qo'shishi mumkin. Extensions ichki API ni tashqi modullardan yashirish uchun ishlatiladi.
Blocks — Objective-C da tashqi ko'rinish doirasidan o'zgaruvchilarni tutib oladigan anonim funksiyalar. Blok sintaksisi: ^(int x) { return x * 2; }. Blocks UIKit da callback handler-lar, Grand Central Dispatch da asinxron vazifalar va NSArray/NSDictionary to'plamlarida funksional operatsiyalar uchun ishlatiladi.
// Blok turining e'lon qilinishi
typedef void (^CompletionBlock)(BOOL success, NSError *error);
// Parametr sifatida blok
- (void)fetchDataWithCompletion:(CompletionBlock)completion {
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
BOOL result = [weakSelf processData];
if (completion) {
completion(result, nil);
}
});
}Xotira boshqaruvi bloklarda muhim ahamiyatga ega. Bloklar self ni kuchli havola bilan tutib oladi, bu to'g'ridan-to'g'ri foydalanishda retain cycle yaratadi. Yechim — __weak typeof(self) weakSelf = self, blok ichida keyingi tekshirish bilan. Bu muammo Swift da [weak self] capture lists orqali to'liq hal qilingan.
Objective-C MRC (Manual Reference Counting) dan ARC (Automatic Reference Counting) gacha yo'lni bosib o'tdi. MRC da dasturchi qo'lda retain (hisoblagichni oshirish), release (kamaytirish) va autorelease (kechiktirilgan release) ni chaqirardi. Bu chaqiruvlardagi xatolar xotira oqishiga yoki dangling pointers sababli crash larga olib kelardi.
| Operatsiya | MRC | ARC |
|---|---|---|
| Ob'ekt yaratish | [[Object alloc] init] | [[Object alloc] init] |
| Havolani ushlab turish | [object retain] | Avtomatik |
| Bo'shatish | [object release] | Avtomatik |
| Avtobo'shatish | [object autorelease] | Avtomatik (talab qilinmaydi) |
| Weak havola | __weak mavjud emas edi | __weak (avtomatik nil) |
ARC Xcode 4.2 va LLVM 3.0 (2011) da taqdim etildi. Kompilyator ob'ektlarning hayot aylanishini tahlil qilib, kompilyatsiya bosqichida avtomatik retain/release qo'shadi. ARC garbage collection emas — bu avtomatik qo'shimchalar bilan statik tahlil. Objective-C ARC Swift ARC bilan mos: ikkalasi runtime darajasida bir xil havola hisobi tizimidan foydalanadi.
Objective-C va Swift ni bir loyihada birgalikda ishlatish — legacy loyihalar uchun odatiy amaliyot. Apple Bridging Header — Swift Objective-C sinflarini, Objective-C esa NSObject dan meros olgan Swift sinflarini ko'radigan avtomatik yaratilgan faylni taqdim etadi.
// ProjectName-Bridging-Header.h
// Swift bu sarlavhalarni avtomatik ko'radi
#import "LegacyManager.h"
#import "NetworkClient.h"
#import "DataStore.h"Objective-C dan Swift ga migratsiya — bosqichma-bosqich jarayon. Yangi fayllar Swift da yoziladi, eskilar asta-sekin refaktor qilinadi. Bridging Header Objective-C loyihasiga birinchi Swift fayli qo'shilganda avtomatik yaratiladi. Teskari ko'rinish uchun (ObjC → Swift) Xcode @objc bilan belgilangan Swift sinflari uchun @interface ni o'z ichiga olgan
// Objective-C dan ko'rinadigan Swift sinfi
@objc class SwiftRouter: NSObject {
@objc func navigateToProfile(userId: Int) {
// implementatsiya
}
}Cheklovlar: Swift value-tiplari (struct, enum) Objective-C dan to'g'ridan-to'g'ri ko'rinmaydi — ularni @objc bilan class ga o'rash kerak. Swift dagi Generics Objective-C dan cheklangan holda mavjud. Tavsiya etilgan yondashuv — yangi kodni Swift da yozish, mavjud Objective-C kodini esa faqat tegishli funksionallik o'zgarganda refaktor qilish.
Objective-C ning Swift dan asosiy ustunligi — runtime ga to'liq kirish. Method swizzling, bajarish vaqtida metodlar implementatsiyasini almashtirish, merossiz tizim metodlarini qayta belgilash imkonini beradi. Aspects va JRSwizzle kabi kutubxonalar bu imkoniyatni AOP (aspektga yo'naltirilgan dasturlash) — monitoring, analitika va loglash uchun ishlatadi.
Forward invocation — yana bir runtime imkoniyati: agar ob'ekt selektorga javob bermasa, tizim forwardInvocation: ni chaqiradi, xabarni boshqa ob'ektga yo'naltirish imkonini beradi. Bu Objective-C da (NSProxy) Proxy pattern ning asosidir, kechiktirilgan initsializatsiya va taqsimlangan ob'ektlar uchun ishlatiladi.
Apple yangi kodda runtime hiylalaridan foydalanishni minimallashtirishni, Swift ning statik tiplashiga ustunlik berishni tavsiya qiladi. Biroq, legacy loyihalarda objc_msgSend, method_exchangeImplementations va objc_getAssociatedObject bilimlari mavjud kod bazasini qo'llab-quvvatlash uchun zarurdir.
Objective-C property ni getter/setter bilan ivar ustidagi sintaktik shakar sifatida qo'llab-quvvatlaydi. atomic/nonatomic, strong/weak/copy, readonly/readwrite va assign/retain modifikatorlari xotira xatti-harakati va ip xavfsizligini aniqlaydi. Key-Value Observing (KVO) — runtime ga o'rnatilgan xususiyat o'zgarishlarini kuzatish mexanizmi: har qanday ob'ekt addObserver orqali boshqa ob'ektning xususiyat o'zgarishlariga obuna bo'lishi mumkin.
Tez-tez beriladigan savollar
Metod chaqiruvi [object selector:argument] kabi ko'rinadi. Xabar runtime da implementatsiyani dinamik topadigan objc_msgSend orqali o'tadi. Selektor metod nomi (@selector(methodName)), funksiya ko'rsatkichi emas. Bu swizzling va forward invocation imkonini beradi.
Category (@interface ClassName (Name)) har qanday sinfga (shu jumladan tizim sinflariga) merossiz metod qo'shadi. Extension (@interface ClassName ()) .m faylida e'lon qilinadi va property va ivar qo'shishi mumkin. Category ivar qo'sha olmaydi, extension — qo'shishi mumkin.
Blocks — ^(parametrlar) { tana } sintaksisi bilan anonim funksiyalar, kontekstdan o'zgaruvchilarni tutib oladi. C++ da lambdalar va Swift da closures ning analogi. Self ni tutib olishda retain cycles oldini olish uchun __weak talab qiladi. UIKit, GCD va Foundation da ishlatiladi.
MRC — qo'lda havola hisobi: dasturchi retain, release, autorelease ni chaqiradi. ARC — avtomatik: kompilyator statik tahlil asosida retain/release qo'shadi. ARC GC emas — ob'ektlar hisoblagich nolga tushganda darhol bo'shatiladi. ARC __weak va __strong modifikatorlarini qo'llab-quvvatlaydi.
Ha, Bridging Header orqali. Swift Objective-C ni bu sarlavha orqali ko'radi, Objective-C Swift ni
Xulosalar
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.