Objective-C: tilning mohiyati va uning iOS-ishlanmasidagi o'rni

Muallif: IT Sectr Nashr etilgan: 2026-02-09 O'qish vaqti: 8 daq

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 — kvadrat qavslardagi xabar sintaksisi va dinamik runtime bilan C ning qat'iy ust to'plami
  • Message passing — objc_msgSend orqali dinamik implementatsiya qidiruvi bilan [object selector:argument] orqali metod chaqiruvi
  • Categories — merossiz va manba kodiga kirmasdan mavjud sinflarga metod qo'shish mexanizmi
  • Blocks — yopilish bilan anonim funksiyalar, Swift closures-ning o'tmishdoshi
  • ARC vs MRC — xotirani boshqarish uchun avtomatik va qo'lda havola hisobi

Objective-C nima?

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.

Sintaksis: C + ob'ekt qo'shimchasi

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 va dinamik dispetcherizatsiya

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.

objective-c
// 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.

Kategoriyalar va sinf kengaytmalari

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.

objective-c
// 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];
}
@end

Extensions (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.

Bloklar — yopilish bilan anonim funksiyalar

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.

objective-c
// 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.

ARC va MRC: xotira boshqaruvi

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.

OperatsiyaMRCARC
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.

Bridging Header orqali Swift bilan o'zaro aloqa

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.

objective-c
// 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 -Swift.h faylini yaratadi.

swift
// 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 da Runtime va method swizzling

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.

Property va Key-Value Observing

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

Objective-C da xabar sintaksisi nima?

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.

Kategoriyalar (Categories) kengaytmalardan (Extensions) qanday farq qiladi?

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.

Objective-C da bloklar (Blocks) nima?

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.

ARC va MRC o'rtasidagi farq nima?

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.

Objective-C va Swift ni bir loyihada ishlatish mumkinmi?

Ha, Bridging Header orqali. Swift Objective-C ni bu sarlavha orqali ko'radi, Objective-C Swift ni -Swift.h orqali ko'radi. Swift sinflari NSObject dan meros olishi va @objc bilan belgilanishi kerak. Swift dan struct va enum Objective-C ga to'g'ridan-to'g'ri ko'rinmaydi.

Xulosalar

  • Objective-C — Cocoa/Cocoa Touch uchun dinamik runtime va xabar sintaksisi bilan C ning qat'iy ust to'plami
  • Message passing — objc_msgSend va swizzling imkoniyati bilan [object method] orqali dinamik dispetcherizatsiya bilan chaqiruvlar
  • Categories — merossiz mavjud sinflarga metod qo'shish, shu jumladan Apple tizim sinflari
  • Blocks — yopilish bilan anonim funksiyalar, retain cycles oldini olish uchun __weak talab qiladi
  • ARC vs MRC — qo'lda retain/release dan kompilyator orqali avtomatik havola hisobiga evolyutsiya
  • Bridging Header — bosqichma-bosqich migratsiya uchun bir loyihada Swift va Objective-C ning birgalikda ishlash mexanizmi
  • Legacy ahamiyati — App Store ilovalarining taxminan 35 foizi qo'llab-quvvatlash talab qiladigan Objective-C kodini o'z ichiga oladi

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.

Loyihani muhokama qilish

Shuningdek o'qing