November 3, 2011
Sekilas Mengenai Objective-C
Objective-C adalah extension dari bahasa pemrograman C. Tujuan dari Objective-C adalah agar C dapat digunakan dengan paradigma Object-Oriented, yang membuat program menjadi lebih reusable berkat fitur inheritance.
Mari kita lihat contoh code C dibawah:
#include <stdio.h>
int main(int argc, char *argv[])
{
int numbers = 2;
puts("Hello World!\n");
puts("numbers value is: %d", numbers);
return 0;
}
Dan kemudian bandingkan dengan code standar Objective-C:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
@autoreleasepool {
int numbers = 2;
NSLog(@"Hello, World!\n");
NSLog(@"numbers value is: %d", numbers);
}
return 0;
}
Dalam hal ini Objective-C boleh dilihat sebagai C dengan library dan runtime tersendiri.
Library yang umumnya digunakan dalam pemrograman Objective-C sendiri bernama Cocoa yang terdiri dari dua framework besar yaitu Foundation dan AppKit.
Untuk iOS, Apple mengembangkan library bernama Cocoa Touch yang merupakan turunan dari Cocoa.
Perbedaan dari keduanya adalah Cocoa Touch menggunakan framework GUI tersendiri yang bernama UIKit.
Cocoa Touch sendiri masih menggunakan Foundation sebagai framework dasar.
Aplikasi Objective-C hanya dapat berjalan dalam platform yang mengadopsi Objective-C runtime, dan kedua platform yang paling kompatibel untuk saat ini adalah Mac OS X dan iOS.
Foundation framework
Foundation adalah framework dasar yang menjadi building blocks dalam mengembangkan aplikasi berbasis Objective-C.
Dalam Foundation terkandung beberapa class dasar yang umumnya menjadi data type di bahasa pemrograman lain, seperti NSString, NSArray, NSDictionary, dsb.
Programmer tetap dapat menggunakan primitif data type dari C seperti int, char, float, double, dsb.
Dalam Foundation juga terkandung sebuah class yang menjadi “root” dari semua object dalam Objective-C, yaitu NSObject.
Boleh dibilang hampir semua class dalam Objective-C adalah turunan dari NSObject.
Program diatas adalah contoh dari program Objective-C standar yang hanya menggunakan Foundation.
Membuat Objects dengan Foundation
Mari kita lihat kembali contoh program diatas dan memodifikasinya dengan menambahkan satu baris code di dalam block @autoreleasepool:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
@autoreleasepool {
NSString *name = [[NSString alloc] initWithString:@"Obet"];
NSLog(@"Your name is: %@", name);
}
return 0;
}
Dari kode diatas yang menjadi perhatian kita adalah NSString *name = [[NSString alloc] initWithString:@"Obet"];.
Jika kita breakdown langkah demi langkah, kode tersebut terdiri dari:
NSString *nameadalah deklarasi daripointerbernamanamedengan typeNSString.[NSString alloc]adalah method call yang memanggil fungsiallocdariNSString.[[NSString alloc] initWithString:@"Obet"]adalah shorthand untuk melakukan alokasi dan inisialisasi object dalam satu waktu.NSString *name = [[NSString alloc] initWithString:@"Obet"];adalah sebuah statement yang menyatakan return dari langkah ke-3 yang berupa memory address akan di-assign kepointerdengan typeNSStringyang bernamaname.
Jadi bisa disimpulkan untuk membuat instance dari sebuah class adalah dengan template seperti:
NamaClass *namaPointer = [[NamaClass alloc] init];
namaPointer akan menjadi pointer dari instance yang dihasilkan oleh [[NamaClass alloc] init].
[[NamaClass alloc] init] akan me-return memory address dari instance NamaClass yang telah dibuat.
Membuat Class di Objective-C
Pertanyaan selanjutnya adalah bagaimana membuat class dalam Objective-C dari awal.
Class dalam Objective-C terdiri dari dua bagian, yaitu header dan implementation.
Dalam header terkandung semua definisi dari class seperti nama class, parent class, protocols, instance variables, dan instance methods.
Dalam implementation terkandung implementasi dari masing-masing method yang sudah didefinisikan sebelumnya dalam header.
Berikut contoh dari class dengan nama Game:
Game.h
// Game.h
#import <UIKit/UIKit.h>
@interface Game : NSObject
@property (strong) NSString *name;
@property (strong) NSString *genre;
@property (strong) NSString *releaseDate;
- (void)printCompletely;
@end
Penjelasan dari masing-masing baris code adalah:
#import <UIKit/UIKit.h>: adalah preprocessor directive untuk melakukan import file header lainnya. Yang termasuk dalam file yang sering di-import adalah seperti frameworks, libraries, atau class lain yang ingin disertakan dalam class yang akan dibuat.@interface Game : NSObject: Special keyword dalam Objective-C antara lain adalah@interfaceyang hampir mirip denganpublic class Game extends OtherClassdi Java.NSObjectsendiri merupakan parent class utama dalam Objective-C.@property (strong) NSString *name;: Adalah definisi dari instance variable bernamanamedengan typeNSString. Dan lagi,@propertyadalah special keyword dalam Objective-C yang menunjukkan bahwa kita ingin mendeklarasikan sebuah instance variable beserta definisi dari setter/getter method-nya.- (void)printCompletely;: Adalah definisi method tambahan dengan namaprintCompletelydengan return value bernama(void).@end: Adalah special keyword yang menunjukkan akhir dari block@interface.
Game.m
// Game.m
#import "Game.h"
@implementation Game
@synthesize name;
@synthesize genre;
@synthesize releaseDate;
- (void)printCompletely
{
NSLog(@"%@, %@, %@", self.name, self.genre, self.releaseDate);
}
- (id)init
{
if ( self = [super init] )
{
self.name = @"Team Fortress 2";
self.genre = @"First-Person Shooter Multiplayer Action";
self.releaseDate = @"October 9, 2007";
}
return self;
}
@end
Penjelasan dari masing-masing baris code adalah:
#import "Game.h":Game.hdanGame.madalah dua file terpisah. Untuk tetap mendapatkan reference dari header,Game.matau implementation tetap membutuhkan reference dariGame.hsebagai header-nya.@implementation Game:@implementationadalah special keyword yang menunjukkan block dibawahnya adalah implementasi dari classGame.@synthesize name;:@synthesizeadalah special keyword dalam Objective-C yang merupakan pasangan dari keyword@property.@synthesizeakan men-generate setter/getter implementation methods dari masing-masing instance variable. Rule of thumb: If you create a@property, don’t forget to@synthesizeit.- (void)printCompletely: Adalah implementasi dari methodprintCompletelyyang sebelumnya sudah didefinisikan di dalam file header.NSLog(@"%@, %@, %@", self.name, self.genre, self.releaseDate);:NSLogadalah sebuah function dari Foundation framework untuk melakukan proses printing output di console. Sangat berguna dalam debugging.self.nameadalah bentuk lain dari[self name]yang akan mengakses getter method untuk mendapatkan return berupa value dariname. Menggunakan.ataudotmerupakan alternatif dari method call yang menggunakan angle brackets[dan].- (id)init;: Penasaran dari mana asalnya methodinit? Method ini sendiri tidak didefinisikan dalam header. Methodinitmerupakan method yang akan dipanggil ketika sebuah Class di-instantiate (istilah lainnya adalah ketika object dari sebuah class dibuat dalam memori).initadalah method yang bertujuan untuk melakukan proses inisialisasi instance variable setelah instance tersebut dialokasikan di memori. Asal muasal methodinitsendiri berasal dari parent class utama yaituNSObject. Karena kita telah mendeklarasikan@interface Game : NSObjectdi headerGame.hmaka secara otomatis kita sudah menyatakan bahwa classGameadalah turunan dariNSObject. Dalam hal iniinitdalamGame.makan meng-override methodinitdari parent-nya yaituNSObject.if ( self = [super init]): Dikarenakan classGamemeng-override methodinitdari parent-nya (NSObject), maka sebagaichildyang meng-override, classGameharus mempersilahkan parent class-nya untuk melakukan inisialisasi terlebih dahulu dengan menggunakan keywordsuperdan memanggil methodinitdari parent. Tujuan dari flow controlifdiatas adalah untuk memastikan bahwa parent class (NSObject) telah sukses melakukan proses inisialisasi sebelum classGamedapat melakukan inisialisasi.