Pemrograman · Bahasa pemrograman
Tutorial Objective-C untuk pemula
Jawaban singkat
Objective-C adalah bahasa C yang ditambah pengiriman pesan berorientasi objek ala Smalltalk. Anda memanggil method dengan mengirim pesan di dalam tanda kurung siku, [object doSomething:arg], mendefinisikan kelas dalam blok @interface dan @implementation, dan memakai framework Foundation dari Apple untuk string, array, dan dictionary. Bahasa ini dulu menjadi bahasa utama aplikasi macOS dan iOS sebelum Swift, dan masih dipakai di banyak basis kode Apple yang sudah ada. Di Mac, kompilasi dengan clang -fobjc-arc -framework Foundation hello.m.
Apa itu Objective-C dan siapa yang memakainya
Objective-C dibuat oleh Brad Cox dan Tom Love pada awal 1980-an, diadopsi NeXT untuk sistem NeXTSTEP, lalu diwarisi Apple, tempat NeXTSTEP menjadi dasar macOS dan iOS. Bahasa ini adalah superset ketat dari C: semua kode C valid sebagai Objective-C, dan keduanya bisa dicampur dengan bebas.
Saat ini Apple merekomendasikan Swift untuk aplikasi baru, tetapi Objective-C tetap didukung penuh. Bahasa ini ditemukan di aplikasi iOS dan macOS lama, di banyak framework sistem dan pustaka pihak ketiga, serta di proyek yang memadukan C atau C++ dengan API Apple. Swift dan Objective-C dapat bekerja bersama dalam satu proyek, sehingga menguasai keduanya berguna bagi developer platform Apple.
Instal dan jalankan Hello, world
Di macOS, instal Xcode atau cukup command line tools (xcode-select --install), yang sudah menyertakan compiler clang dan framework Foundation. File sumber memakai ekstensi .m; header memakai .h.
// hello.m
#import <Foundation/Foundation.h>
int main(void) {
@autoreleasepool {
NSLog(@"Hello, world!");
}
return 0;
}clang -fobjc-arc -framework Foundation hello.m -o hello
./hello
# 2026-10-31 10:00:00.000 hello[1234:5678] Hello, world!NSLog menulis ke standard error dan menambahkan stempel waktu serta nama proses. @"..." membuat objek NSString, bukan string C. -fobjc-arc mengaktifkan Automatic Reference Counting, manajemen memori standar. Di Linux, proyek GNUstep menyediakan pustaka Foundation yang kompatibel, dengan perintah build yang berbeda.
Tipe, objek, dan pesan
Karena Objective-C adalah C, semua tipe C dapat dipakai. Objek selalu digunakan lewat pointer (NSString *name). Memanggil method disebut mengirim pesan; argumen diselipkan di antara bagian-bagian nama method.
| Tipe | Contoh | Catatan |
|---|---|---|
| Angka C | int, double, NSInteger | NSInteger berukuran 64-bit pada platform 64-bit |
| BOOL | BOOL ok = YES; | YES / NO |
| NSString * | @"hello" | Objek string yang immutable |
| NSNumber * | @42, @3.14, @(x + 1) | Membungkus angka agar bisa disimpan dalam koleksi |
| id | id thing = @"x"; | Pointer ke objek apa pun, tanpa tipe statis |
| nil | nil | Pointer objek null |
NSString *name = @"Ana";
NSInteger age = 30;
NSString *line = [NSString stringWithFormat:@"%@ is %ld", name, (long)age];
NSLog(@"%@", line); // Ana is 30
NSLog(@"%lu", (unsigned long)[name length]); // 3
NSString *upper = [name uppercaseString]; // @"ANA"
BOOL same = [name isEqualToString:@"Ana"]; // YES
NSString *nothing = nil;
NSLog(@"%lu", (unsigned long)[nothing length]); // 0: messages to nil return 0Dalam format string, %@ mencetak sebuah objek (memanggil method description-nya). Mengirim pesan ke nil diperbolehkan dan mengembalikan nil atau 0, yang mencegah banyak crash tetapi juga bisa menyembunyikan bug.
Alur kontrol
Alur kontrolnya persis seperti C: if, else, switch, for, while, dan do ... while. Objective-C menambahkan fast enumeration dengan for ... in untuk koleksi.
NSInteger score = 85;
if (score >= 90) {
NSLog(@"A");
} else if (score >= 80) {
NSLog(@"B");
} else {
NSLog(@"C");
}
for (int i = 1; i <= 3; i++) {
NSLog(@"%d squared is %d", i, i * i);
}
for (NSString *fruit in @[@"apple", @"pear"]) {
NSLog(@"%@", fruit);
}Kelas, properti, dan method
Sebuah kelas memiliki interface publik (biasanya di file .h) dan implementasi (di file .m). Instance method diawali -, class method diawali +. @property mendeklarasikan properti dan membuatkan getter, setter, serta variabel pendukung yang namanya diawali garis bawah.
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic) NSInteger age;
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age;
- (NSString *)greeting;
@end
@implementation Person
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age {
self = [super init];
if (self) {
_name = [name copy];
_age = age;
}
return self;
}
- (NSString *)greeting {
return [NSString stringWithFormat:@"Hi, I am %@, %ld", self.name, (long)self.age];
}
@end
// Usage inside main:
Person *ana = [[Person alloc] initWithName:@"Ana" age:30];
NSLog(@"%@", [ana greeting]); // Hi, I am Ana, 30
ana.age = 31; // dot syntax calls the setterObjek dibuat dalam dua langkah: alloc memesan memori dan method init... menginisialisasinya. Method di atas bernama initWithName:age: (tanda titik dua adalah bagian dari nama). Protocol (@protocol) berperan sebagai interface, dan category memungkinkan Anda menambahkan method ke kelas yang sudah ada, bahkan NSString.
Koleksi Foundation dan block
Framework Foundation menyediakan koleksi immutable beserta subkelas mutable-nya. Literal membuat penulisannya singkat. Koleksi hanya menyimpan objek, jadi angka dibungkus sebagai NSNumber, dan nil tidak bisa disimpan (gunakan [NSNull null] sebagai gantinya).
| Kelas | Literal atau cara pembuatan | Versi mutable |
|---|---|---|
| NSArray | @[@"Ana", @"Ben"] | NSMutableArray |
| NSDictionary | @{@"Ana": @30} | NSMutableDictionary |
| NSSet | [NSSet setWithArray:arr] | NSMutableSet |
| NSString | @"text" | NSMutableString |
NSArray<NSString *> *names = @[@"Ana", @"Ben"];
NSMutableArray<NSString *> *more = [names mutableCopy];
[more addObject:@"Cleo"];
NSDictionary<NSString *, NSNumber *> *ages = @{@"Ana": @30, @"Ben": @17};
NSLog(@"%lu names, Ana is %@", (unsigned long)more.count, ages[@"Ana"]);
NSInteger (^square)(NSInteger) = ^(NSInteger x) { return x * x; };
NSLog(@"%ld", (long)square(7)); // 49
NSArray<NSNumber *> *sorted = [@[@3, @1, @2]
sortedArrayUsingComparator:^NSComparisonResult(NSNumber *a, NSNumber *b) {
return [a compare:b];
}];
NSLog(@"%@", [sorted componentsJoinedByString:@", "]); // 1, 2, 3Block, ditulis dengan ^, adalah closure: fungsi anonim yang menangkap variabel dari lingkup di sekitarnya. API Apple memakainya untuk callback, pengurutan, dan pekerjaan asinkron dengan Grand Central Dispatch. Bagian <NSString *> adalah generics ringan yang membantu compiler dan Swift; bagian itu opsional.
Manajemen memori dan penanganan error
Dengan ARC, compiler menyisipkan pemanggilan reference counting untuk Anda: objek dibebaskan ketika tidak ada lagi strong reference yang menunjuk ke sana. Anda hanya perlu memutus reference cycle, biasanya dengan menandai salah satu sisinya weak (misalnya properti delegate).
Error yang dapat dipulihkan memakai pola NSError: method mengembalikan nil atau NO saat gagal dan mengisi objek NSError yang diteruskan lewat referensi. Exception (@try, @catch, NSException) memang ada, tetapi di Cocoa exception menandakan kesalahan programmer seperti indeks di luar rentang, bukan kegagalan biasa.
NSError *error = nil;
NSString *text = [NSString stringWithContentsOfFile:@"/no/such/file"
encoding:NSUTF8StringEncoding
error:&error];
if (text == nil) {
NSLog(@"Failed: %@", error.localizedDescription);
}Program lengkap kecil: frekuensi kata
#import <Foundation/Foundation.h>
int main(void) {
@autoreleasepool {
NSString *text = @"the cat and the hat and the bat";
NSMutableDictionary<NSString *, NSNumber *> *counts = [NSMutableDictionary dictionary];
for (NSString *word in [text componentsSeparatedByString:@" "]) {
counts[word] = @(counts[word].integerValue + 1);
}
NSArray<NSString *> *sorted = [counts keysSortedByValueUsingComparator:
^NSComparisonResult(NSNumber *a, NSNumber *b) { return [b compare:a]; }];
for (NSString *word in [sorted subarrayWithRange:NSMakeRange(0, 2)]) {
printf("%s %ld\n", word.UTF8String, (long)counts[word].integerValue);
}
}
return 0;
}
// the 3
// and 2Untuk kata baru, counts[word] bernilai nil, dan nil.integerValue mengembalikan 0, sehingga hitungan pertama menjadi 1. Comparator membalik urutan untuk mengurutkan berdasarkan jumlah dari tinggi ke rendah, dan printf mencetak tanpa awalan NSLog.
Langkah selanjutnya
- Panduan "Programming with Objective-C" Apple di arsip dokumentasi untuk dasar-dasar bahasa.
- Referensi framework Foundation di dokumentasi developer Apple.
- Dokumentasi Clang tentang Automatic Reference Counting untuk aturan memori yang tepat.
- Pelajari cara Objective-C dan Swift bekerja bersama jika Anda memelihara basis kode campuran.
FAQ
Apakah Objective-C masih dipakai?
Ya, terutama di aplikasi dan pustaka iOS serta macOS yang sudah ada. Apple merekomendasikan Swift untuk kode baru, tetapi Objective-C tetap didukung oleh Xcode dan SDK Apple.
Sebaiknya belajar Swift atau Objective-C dulu?
Untuk pengembangan Apple yang baru, pelajari Swift lebih dulu. Pelajari Objective-C ketika Anda perlu membaca atau memelihara kode lama, memakai pustaka C atau C++ secara dekat, atau memahami cara kerja framework Apple di baliknya.
Apa arti tanda kurung siku di Objective-C?
Tanda itu mengirim pesan: [receiver message] memanggil method message pada objek receiver. Argumen mengikuti tanda titik dua, seperti pada [dict setObject:value forKey:key].
Apakah Objective-C punya garbage collection?
Objective-C modern memakai Automatic Reference Counting (ARC), tempat compiler menambahkan pemanggilan retain dan release. Garbage collector lama Apple untuk macOS sudah deprecated dan tidak tersedia lagi.