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 — 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.
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 — 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.
// 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.
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).
// 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];
}
@endExtensions (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.
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.
// 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].
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.
| Operasi | MRC | ARC |
|---|---|---|
| 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.
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.
// 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
// 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.
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.
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
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.
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.
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.
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.
Ya, melalui Bridging Header. Swift melihat Objective-C melalui header ini, Objective-C melihat Swift melalui
Kesimpulan
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.
Baca juga