Objective-C: apa esensi bahasa dan tempatnya dalam pengembangan iOS

Penulis: IT Sectr Diterbitkan: 2026-02-09 Waktu membaca: 8 mnt

Objective-C — bahasa pemrograman dengan pengiriman pesan dinamis, dibuat oleh Brad Cox pada tahun 1980-an. Apple memilih Objective-C sebagai bahasa utama untuk NeXTSTEP, dan kemudian untuk iOS SDK. Programming With Objective-C — pengantar sintaks pesan dan manajemen memori.

Utama

  • Objective-C — superketat dari C dengan sintaks pesan dalam kurung siku dan runtime dinamis
  • Message passing — pemanggilan metode melalui [object selector:argument] dengan pencarian implementasi dinamis melalui objc_msgSend
  • Categories — mekanisme penambahan metode ke kelas yang ada tanpa pewarisan dan tanpa akses ke kode sumber
  • Blocks — fungsi anonim dengan penutupan, pendahulu Swift closures
  • ARC vs MRC — penghitungan referensi otomatis dan manual untuk manajemen memori

Apa itu Objective-C?

Objective-C — bahasa pemrograman yang memperluas C dengan kemampuan pemrograman berorientasi objek bergaya Smalltalk. Kode Objective-C dikompilasi melalui LLVM atau GCC menjadi kode mesin asli, mempertahankan kompatibilitas mundur penuh dengan C — kode C apa pun benar dalam Objective-C.

Apple mengakuisisi NeXT (bersama Objective-C) pada tahun 1997. Bahasa ini menjadi dasar Cocoa dan Cocoa Touch — framework untuk macOS dan iOS. Sejak 2014, Apple mempromosikan Swift sebagai pengganti, tetapi Objective-C tetap penting untuk proyek legacy dan beberapa framework sistem. Menurut Apple (WWDC 2024), sekitar 35% aplikasi di App Store masih mengandung kode Objective-C.

Fitur utama — runtime dinamis. Tidak seperti Swift, di mana pemanggilan metode diselesaikan pada tahap kompilasi, Objective-C mengirim pesan selama eksekusi melalui fungsi objc_msgSend. Ini memungkinkan penimpaan metode dengan cepat (method swizzling), penambahan kelas secara dinamis, dan penggunaan forward invocation untuk selektor yang tidak ada.

Sintaks: C + lapisan objek

Kode C apa pun benar dalam Objective-C. Lapisan objek menambahkan kelas (@interface/@implementation), kategori, protokol (@protocol) dan pengetikan dinamis (id). File memiliki ekstensi .m (implementasi) dan .h (header).

Sintaks pesan dan pengiriman dinamis

Sintaks pesan — perbedaan utama Objective-C dari bahasa mirip C. Alih-alih object.method(argument) digunakan [object method:argument]. Setiap pesan melewati objc_msgSend, yang secara dinamis mencari implementasi metode di runtime.

objective-c
// Sintaks pesan dengan parameter bernama
NSString *greeting = [NSString stringWithFormat:@"Hello, %@", name];

// Pesan bersarang
NSArray *sortedArray = [[array sortedArrayUsingSelector:@selector(compare:)] copy];

// Pemeriksaan tipe melalui introspeksi
if ([object isKindOfClass:[UIView class]]) {
    UIView *view = (UIView *)object;
    view.backgroundColor = [UIColor redColor];
}

Dynamic dispatch memungkinkan penimpaan metode di runtime (method swizzling) — teknik yang kuat namun berbahaya. Misalnya, framework seperti AFNetworking dan Aspects menggunakan swizzling untuk mencegat panggilan URLSession. Apple memperingatkan: swizzling dapat mengganggu kerja framework sistem jika digunakan secara tidak benar.

Kategori dan ekstensi kelas

Categories — kemampuan unik Objective-C untuk menambahkan metode ke kelas yang ada (termasuk sistem, seperti NSString dan UIView) tanpa pewarisan dan tanpa akses ke kode sumber. Kategori dideklarasikan melalui @interface ClassName (CategoryName).

objective-c
// File UIColor+Hex.h — kategori untuk UIColor
@interface UIColor (Hex)
+ (instancetype)colorWithHex:NSUIntegerhex;
@end

// File UIColor+Hex.m — implementasi
@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) — jenis kategori khusus, dideklarasikan di file .m tanpa nama: @interface ClassName (). Tidak seperti kategori, extensions dapat menambahkan tidak hanya metode, tetapi juga ivar (variabel instance) dan property. Extensions digunakan untuk menyembunyikan API internal dari modul eksternal.

Blok (Blocks) — fungsi anonim dengan penutupan

Blocks — fungsi anonim di Objective-C yang menangkap variabel dari lingkup visibilitas eksternal. Sintaks blok: ^(int x) { return x * 2; }. Blocks digunakan di UIKit untuk handler callback, di Grand Central Dispatch untuk tugas asinkron, dan di koleksi NSArray/NSDictionary untuk operasi fungsional.

objective-c
// Deklarasi tipe blok
typedef void (^CompletionBlock)(BOOL success, NSError *error);

// Blok sebagai parameter
- (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);
        }
    });
}

Manajemen memori dalam blok sangat penting. Blok menangkap self dengan referensi kuat, yang menciptakan retain cycle saat penggunaan langsung. Solusi — __weak typeof(self) weakSelf = self, dengan pemeriksaan lanjutan di dalam blok. Masalah ini sepenuhnya terpecahkan di Swift melalui capture list [weak self].

ARC dan MRC: manajemen memori

Objective-C telah melalui perjalanan dari MRC (Manual Reference Counting) ke ARC (Automatic Reference Counting). Di MRC, pengembang secara manual memanggil retain (menaikkan penghitung), release (menurunkan), dan autorelease (release tertunda). Kesalahan dalam panggilan ini menyebabkan kebocoran memori atau crash karena dangling pointers.

OperasiMRCARC
Pembuatan objek[[Object alloc] init][[Object alloc] init]
Menahan referensi[object retain]Otomatis
Pembebasan[object release]Otomatis
Pembebasan otomatis[object autorelease]Otomatis (tidak diperlukan)
Referensi Weak__weak tidak ada__weak (nil otomatis)

ARC diperkenalkan di Xcode 4.2 dan LLVM 3.0 (2011). Kompiler secara otomatis menyisipkan retain/release pada tahap kompilasi, menganalisis masa hidup objek. ARC bukan garbage collection — ini adalah analisis statis dengan penyisipan otomatis. Objective-C ARC kompatibel dengan Swift ARC: keduanya menggunakan sistem penghitungan referensi yang sama di tingkat runtime.

Interaksi dengan Swift melalui Bridging Header

Penggunaan bersama Objective-C dan Swift dalam satu proyek — praktik umum untuk proyek legacy. Apple menyediakan Bridging Header — file yang dibuat secara otomatis yang memungkinkan Swift melihat kelas Objective-C, dan Objective-C melihat kelas Swift yang mewarisi dari NSObject.

objective-c
// ProjectName-Bridging-Header.h
// Swift melihat header ini secara otomatis
#import "LegacyManager.h"
#import "NetworkClient.h"
#import "DataStore.h"

Migrasi dari Objective-C ke Swift — proses bertahap. File baru ditulis di Swift, file lama direfaktor secara bertahap. Bridging Header dibuat secara otomatis saat menambahkan file Swift pertama ke proyek Objective-C. Untuk visibilitas terbalik (ObjC → Swift), Xcode menghasilkan file -Swift.h yang berisi @interface untuk kelas Swift yang ditandai dengan @objc.

swift
// Kelas Swift terlihat dari Objective-C
@objc class SwiftRouter: NSObject {
    @objc func navigateToProfile(userId: Int) {
        // implementasi
    }
}

Keterbatasan: tipe value Swift (struct, enum) tidak terlihat langsung dari Objective-C — harus dibungkus dalam class dengan @objc. Generics di Swift terbatas aksesnya dari Objective-C. Pendekatan yang disarankan — tulis kode baru di Swift, dan refaktor kode Objective-C yang ada hanya saat mengubah fungsionalitas terkait.

Runtime dan method swizzling di Objective-C

Keunggulan utama Objective-C dibandingkan Swift — akses penuh ke runtime. Method swizzling, penggantian implementasi metode selama eksekusi, memungkinkan penimpaan metode sistem tanpa pewarisan. Pustaka seperti Aspects dan JRSwizzle menggunakan kemampuan ini untuk AOP (pemrograman berorientasi aspek) — pemantauan, analitik, dan pencatatan.

Forward invocation — kemampuan runtime lainnya: jika objek tidak merespons selektor, sistem memanggil forwardInvocation:, memungkinkan pengalihan pesan ke objek lain. Ini adalah dasar dari pola Proxy di Objective-C (NSProxy), digunakan untuk inisialisasi tertunda dan objek terdistribusi.

Apple merekomendasikan untuk meminimalkan penggunaan trik runtime dalam kode baru, lebih memilih pengetikan statis Swift. Namun, dalam proyek legacy, pengetahuan tentang objc_msgSend, method_exchangeImplementations, dan objc_getAssociatedObject diperlukan untuk mendukung basis kode yang ada.

Property dan Key-Value Observing

Objective-C mendukung property sebagai gula sintaksis di atas ivar dengan getter/setter. Pengubah atomic/nonatomic, strong/weak/copy, readonly/readwrite, dan assign/retain menentukan perilaku memori dan keamanan thread. Key-Value Observing (KVO) — mekanisme pengamatan perubahan properti yang terpasang di runtime: objek apa pun dapat berlangganan perubahan properti objek lain melalui addObserver.

Pertanyaan yang Sering Diajukan

Apa itu sintaks pesan di Objective-C?

Pemanggilan metode terlihat seperti [object selector:argument]. Pesan melewati objc_msgSend, yang secara dinamis menemukan implementasi di runtime. Selektor adalah nama metode (@selector(methodName)), bukan penunjuk fungsi. Ini memungkinkan swizzling dan forward invocation.

Apa perbedaan kategori (Categories) dengan ekstensi (Extensions)?

Category (@interface ClassName (Name)) menambahkan metode ke kelas apa pun (termasuk sistem) tanpa pewarisan. Extension (@interface ClassName ()) dideklarasikan di file .m dan dapat menambahkan property dan ivar. Category tidak dapat menambahkan ivar, extension bisa.

Apa itu blok (Blocks) di Objective-C?

Blocks — fungsi anonim dengan sintaks ^(parameter) { tubuh }, menangkap variabel dari konteks. Analog lambda di C++ dan closures di Swift. Memerlukan __weak untuk mencegah retain cycles saat menangkap self. Digunakan di UIKit, GCD, dan Foundation.

Apa perbedaan antara ARC dan MRC?

MRC — penghitungan referensi manual: pengembang memanggil retain, release, autorelease. ARC — otomatis: kompiler menyisipkan retain/release berdasarkan analisis statis. ARC bukan GC — objek dibebaskan segera saat penghitung nol. ARC mendukung pengubah __weak dan __strong.

Bisakah Objective-C dan Swift digunakan dalam satu proyek?

Ya, melalui Bridging Header. Swift melihat Objective-C melalui header ini, Objective-C melihat Swift melalui -Swift.h. Kelas Swift harus mewarisi dari NSObject dan ditandai dengan @objc. Struct dan enum dari Swift tidak terlihat langsung oleh Objective-C.

Kesimpulan

  • Objective-C — superketat dari C dengan runtime dinamis dan sintaks pesan untuk Cocoa/Cocoa Touch
  • Message passing — panggilan melalui [object method] dengan pengiriman dinamis melalui objc_msgSend dan kemungkinan swizzling
  • Categories — penambahan metode ke kelas yang ada tanpa pewarisan, termasuk kelas sistem Apple
  • Blocks — fungsi anonim dengan penutupan, memerlukan __weak untuk mencegah retain cycles
  • ARC vs MRC — evolusi dari retain/release manual ke penghitungan referensi otomatis melalui kompiler
  • Bridging Header — mekanisme kerja bersama Swift dan Objective-C dalam satu proyek untuk migrasi bertahap
  • Pentingnya legacy — sekitar 35% aplikasi App Store mengandung kode Objective-C yang memerlukan dukungan

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga