Panduan Cepat Objective-C

Objective-C adalah bahasa tujuan umum yang dikembangkan di atas bahasa Pemrograman C dengan menambahkan fitur bahasa pemrograman Small Talk sehingga menjadikannya bahasa berorientasi objek. Ini terutama digunakan dalam mengembangkan sistem operasi iOS dan Mac OS X serta aplikasinya.

Awalnya, Objective-C dikembangkan oleh NeXT untuk NeXTSTEP OS yang diambil alih oleh Apple untuk iOS dan Mac OS X.

Pemrograman berorientasi objek

Mendukung penuh pemrograman berorientasi objek, termasuk empat pilar pengembangan berorientasi objek -

  • Encapsulation
  • Menyembunyikan data
  • Inheritance
  • Polymorphism

Kode Contoh

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

   NSLog (@"hello world");
   [pool drain];
   return 0;
}

Kerangka Dasar

Framework Foundation menyediakan banyak fitur dan terdaftar di bawah ini.

  • Ini mencakup daftar tipe data yang diperpanjang seperti NSArray, NSDictionary, NSSet, dan sebagainya.

  • Ini terdiri dari serangkaian fungsi yang kaya yang memanipulasi file, string, dll.

  • Ini menyediakan fitur untuk penanganan URL, utilitas seperti format tanggal, penanganan data, penanganan kesalahan, dll.

Tujuan Pembelajaran-C

Hal terpenting yang harus dilakukan saat mempelajari Objective-C adalah fokus pada konsep dan tidak tersesat dalam detail teknis bahasa.

Tujuan belajar bahasa pemrograman adalah untuk menjadi programmer yang lebih baik; yaitu, menjadi lebih efektif dalam merancang dan menerapkan sistem baru dan memelihara yang lama.

Penggunaan Objective-C

Objective-C, seperti yang disebutkan sebelumnya, digunakan di iOS dan Mac OS X. Ini memiliki basis pengguna iOS yang besar dan sebagian besar meningkatkan pengguna Mac OS X. Dan karena Apple berfokus pada kualitas terlebih dahulu dan luar biasa bagi mereka yang mulai belajar Objective-C.

Pengaturan Lingkungan Lokal

Jika Anda masih ingin mengatur lingkungan Anda untuk bahasa pemrograman Objective-C, Anda memerlukan dua perangkat lunak berikut yang tersedia di komputer Anda, (a) Text Editor dan (b) GCC Compiler.

Editor Teks

Ini akan digunakan untuk mengetik program Anda. Contoh beberapa editor termasuk Windows Notepad, perintah OS Edit, Brief, Epsilon, EMACS, dan vim atau vi.

Nama dan versi editor teks dapat berbeda pada sistem operasi yang berbeda. Misalnya, Notepad akan digunakan di Windows, dan vim atau vi dapat digunakan di windows serta Linux atau UNIX.

File yang Anda buat dengan editor Anda disebut file sumber dan berisi kode sumber program. File sumber untuk program Objective-C biasanya dinamai dengan ekstensi ".m".

Sebelum memulai pemrograman Anda, pastikan Anda memiliki satu editor teks dan Anda memiliki cukup pengalaman untuk menulis program komputer, simpan dalam sebuah file, kompilasi dan terakhir jalankan.

Penyusun GCC

Kode sumber yang ditulis dalam file sumber adalah sumber yang dapat dibaca manusia untuk program Anda. Ini perlu "dikompilasi" untuk berubah menjadi bahasa mesin, sehingga CPU Anda benar-benar dapat menjalankan program sesuai instruksi yang diberikan.

Kompilator GCC ini akan digunakan untuk mengompilasi kode sumber Anda menjadi program akhir yang dapat dieksekusi. Saya berasumsi Anda memiliki pengetahuan dasar tentang kompiler bahasa pemrograman.

Kompiler GCC tersedia secara gratis di berbagai platform dan prosedur penyiapan di berbagai platform dijelaskan di bawah.

Instalasi di UNIX / Linux

Langkah awal adalah menginstal gcc bersama dengan paket Gcc Objective-C. Ini dilakukan oleh -

$ su - $ yum install gcc
$ yum install gcc-objc

Langkah selanjutnya adalah mengatur dependensi paket menggunakan perintah berikut -

$ yum install make libpng libpng-devel libtiff libtiff-devel libobjc 
   libxml2 libxml2-devel libX11-devel libXt-devel libjpeg libjpeg-devel

Untuk mendapatkan fitur penuh Objective-C, unduh dan instal GNUStep. Ini dapat dilakukan dengan mengunduh paket darihttp://main.gnustep.org/resources/downloads.php.

Sekarang, kita perlu beralih ke folder yang diunduh dan membongkar file dengan -

$ tar xvfz gnustep-startup-
      
       .tar.gz 
      

Sekarang, kita perlu beralih ke folder gnustep-startup yang dibuat menggunakan -

$ cd gnustep-startup-<version>

Selanjutnya, kita perlu mengonfigurasi proses build -

$ ./configure

Kemudian, kita dapat membangun dengan -

$ make

Kami akhirnya harus menyiapkan lingkungan dengan -

$ . /usr/GNUstep/System/Library/Makefiles/GNUstep.sh

Kami memiliki helloWorld.m Objective-C sebagai berikut -

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   
   NSLog (@"hello world");
   [pool drain];
   return 0;
}

Sekarang, kita dapat mengkompilasi dan menjalankan file Objective-C say helloWorld.m dengan beralih ke folder yang berisi file tersebut menggunakan cd dan kemudian menggunakan langkah-langkah berikut -

$ gcc `gnustep-config --objc-flags` 
-L/usr/GNUstep/Local/Library/Libraries 
-lgnustep-base helloWorld.m -o helloWorld
$ ./helloWorld

Kita dapat melihat output berikut -

2013-09-07 10:48:39.772 tutorialsPoint[12906] hello world

Instalasi di Mac OS

Jika Anda menggunakan Mac OS X, cara termudah untuk mendapatkan GCC adalah dengan mengunduh lingkungan pengembangan Xcode dari situs web Apple dan ikuti petunjuk penginstalan sederhana. Setelah Anda mengatur Xcode, Anda akan dapat menggunakan kompiler GNU untuk C / C ++.

Xcode saat ini tersedia di developer.apple.com/technologies/tools/ .

Instalasi di Windows

Untuk menjalankan program Objective-C di windows, kita perlu menginstal MinGW dan GNUStep Core. Keduanya tersedia dihttps://www.gnu.org/software/gnustep/windows/installer.html.

Pertama, kita perlu menginstal paket Sistem MSYS / MinGW. Kemudian, kita perlu menginstal paket GNUstep Core. Keduanya menyediakan penginstal windows, yang cukup jelas.

Kemudian gunakan Objective-C dan GNUstep dengan memilih Start -> All Programs -> GNUstep -> Shell

Beralih ke folder yang berisi helloWorld.m

Kita dapat mengkompilasi program dengan menggunakan -

$ gcc `gnustep-config --objc-flags` 
-L /GNUstep/System/Library/Libraries hello.m -o hello -lgnustep-base -lobjc

Kita dapat menjalankan program dengan menggunakan -

./hello.exe

Kami mendapatkan output berikut -

2013-09-07 10:48:39.772 tutorialsPoint[1200] hello world

Sebelum kita mempelajari blok bangunan dasar dari bahasa pemrograman Objective-C, mari kita lihat struktur program Objective-C minimum sehingga kita dapat menjadikannya sebagai referensi di bab-bab selanjutnya.

Contoh Objective-C Hello World

Program Objective-C pada dasarnya terdiri dari bagian-bagian berikut -

  • Perintah Preprocessor
  • Interface
  • Implementation
  • Method
  • Variables
  • Pernyataan & Ekspresi
  • Comments

Mari kita lihat kode sederhana yang akan mencetak kata "Hello World" -

#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
- (void)sampleMethod;
@end

@implementation SampleClass

- (void)sampleMethod {
   NSLog(@"Hello, World! \n");
}

@end

int main() {
   /* my first program in Objective-C */
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass sampleMethod];
   return 0;
}

Mari kita lihat berbagai bagian dari program di atas -

  • Baris pertama dari program #import <Foundation / Foundation.h> adalah perintah preprocessor, yang memberitahu compiler Objective-C untuk menyertakan file Foundation.h sebelum pergi ke kompilasi sebenarnya.

  • Baris berikutnya @interface SampleClass: NSObject menunjukkan cara membuat antarmuka. Ini mewarisi NSObject, yang merupakan kelas dasar dari semua objek.

  • Baris berikutnya - (void) sampleMethod; menunjukkan cara mendeklarasikan metode.

  • Baris berikutnya @end menandai akhir dari sebuah antarmuka.

  • Baris berikutnya @implementation SampleClass menunjukkan bagaimana mengimplementasikan antarmuka SampleClass.

  • Baris berikutnya - (void) sampleMethod {} menunjukkan implementasi sampleMethod.

  • Baris berikutnya @end menandai akhir implementasi.

  • Baris berikutnya int main () adalah fungsi utama tempat eksekusi program dimulai.

  • Baris berikutnya /*...*/ akan diabaikan oleh kompilator dan telah dimasukkan untuk menambahkan komentar tambahan dalam program. Jadi baris seperti itu disebut komentar dalam program.

  • Baris berikutnya NSLog (...) adalah fungsi lain yang tersedia di Objective-C yang menyebabkan pesan "Hello, World!" untuk ditampilkan di layar.

  • Baris selanjutnya return 0; mengakhiri fungsi main () dan mengembalikan nilai 0.

Kompilasi & Jalankan Program Objective-C

Sekarang ketika kita mengkompilasi dan menjalankan program, kita akan mendapatkan hasil sebagai berikut.

2017-10-06 07:48:32.020 demo[65832] Hello, World!

Anda telah melihat struktur dasar program Objective-C, sehingga akan mudah untuk memahami blok bangunan dasar lain dari bahasa pemrograman Objective-C.

Token di Objective-C

Program Objective-C terdiri dari berbagai token dan token adalah kata kunci, pengidentifikasi, konstanta, string literal, atau simbol. Misalnya, pernyataan Objective-C berikut terdiri dari enam token -

NSLog(@"Hello, World! \n");

Token individu adalah -

NSLog
@
(
   "Hello, World! \n"
)
;

Titik koma;

Dalam program Objective-C, titik koma adalah terminator pernyataan. Artinya, setiap pernyataan individu harus diakhiri dengan titik koma. Ini menunjukkan akhir dari satu entitas logis.

Misalnya, berikut adalah dua pernyataan berbeda -

NSLog(@"Hello, World! \n");
return 0;

Komentar

Komentar seperti membantu teks dalam program Objective-C Anda dan diabaikan oleh kompilator. Mereka mulai dengan / * dan diakhiri dengan karakter * / seperti yang ditunjukkan di bawah ini -

/* my first program in Objective-C */

Anda tidak dapat memiliki komentar dengan di komentar dan itu tidak muncul dalam string atau karakter literal.

Pengenal

Pengenal Objective-C adalah nama yang digunakan untuk mengidentifikasi variabel, fungsi, atau item buatan pengguna lainnya. Pengenal dimulai dengan huruf A sampai Z atau a sampai z atau garis bawah _ diikuti dengan nol atau lebih huruf, garis bawah, dan angka (0 sampai 9).

Objective-C tidak mengizinkan karakter tanda baca seperti @, $, dan% dalam pengenal. Objective-C adalah acase-sensitivebahasa pemrograman. Jadi, Manpower dan manpower adalah dua pengidentifikasi berbeda di Objective-C. Berikut beberapa contoh pengenal yang dapat diterima -

mohd       zara    abc   move_name  a_123
myname50   _temp   j     a23b9      retVal

Kata kunci

Daftar berikut menunjukkan beberapa kata yang dipesan di Objective-C. Kata-kata yang dicadangkan ini tidak boleh digunakan sebagai konstanta atau variabel atau nama pengenal lainnya.

mobil lain panjang beralih
istirahat enum daftar typedef
kasus eksternal kembali Persatuan
arang mengapung pendek unsigned
const untuk tertanda kosong
terus pergi ke ukuran dari lincah
default jika statis sementara
melakukan int struct _Penuh sesak
dua kali lipat protokol antarmuka penerapan
NSObject NSInteger NSNumber CGFloat
Properti nonatomik; menahan kuat
lemah unsafe_unretained; Baca tulis hanya baca

Spasi kosong di Objective-C

Sebuah baris yang hanya berisi spasi, kemungkinan dengan komentar, disebut sebagai baris kosong, dan compiler Objective-C mengabaikannya sama sekali.

Spasi putih adalah istilah yang digunakan di Objective-C untuk mendeskripsikan blank, tab, karakter baris baru, dan komentar. Spasi putih memisahkan satu bagian pernyataan dari yang lain dan memungkinkan kompiler untuk mengidentifikasi di mana satu elemen dalam pernyataan, seperti int, berakhir, dan elemen berikutnya dimulai. Oleh karena itu, dalam pernyataan berikut -

int age;

Harus ada setidaknya satu karakter spasi (biasanya spasi) antara int dan age agar kompilator dapat membedakannya. Di sisi lain, dalam pernyataan berikut,

fruit = apples + oranges;   // get the total fruit

Tidak ada karakter spasi kosong yang diperlukan antara buah dan =, atau antara = dan apel, meskipun Anda bebas memasukkan beberapa jika Anda ingin agar dapat dibaca.

Dalam bahasa pemrograman Objective-C, tipe data mengacu pada sistem ekstensif yang digunakan untuk mendeklarasikan variabel atau fungsi dari tipe yang berbeda. Jenis variabel menentukan berapa banyak ruang yang ditempati dalam penyimpanan dan bagaimana pola bit yang disimpan diinterpretasikan.

Jenis di Objective-C dapat diklasifikasikan sebagai berikut -

Sr.No. Jenis & Deskripsi
1

Basic Types −

Mereka adalah tipe aritmatika dan terdiri dari dua tipe: (a) tipe integer dan (b) tipe floating-point.

2

Enumerated types −

Mereka lagi-lagi jenis aritmatika dan mereka digunakan untuk mendefinisikan variabel yang hanya dapat diberi nilai integer diskrit tertentu di seluruh program.

3

The type void −

Kekosongan penentu tipe menunjukkan bahwa tidak ada nilai yang tersedia.

4

Derived types −

Mereka termasuk (a) Jenis penunjuk, (b) Jenis Array, (c) Jenis struktur, (d) Jenis Union dan (e) Jenis Fungsi.

Jenis array dan jenis struktur disebut secara kolektif sebagai jenis agregat. Tipe dari sebuah fungsi menentukan tipe dari nilai yang dikembalikan dari fungsi tersebut. Kita akan melihat tipe dasar di bagian selanjutnya sedangkan tipe lainnya akan dibahas di bab selanjutnya.

Jenis Integer

Tabel berikut memberi Anda detail tentang jenis bilangan bulat standar dengan ukuran penyimpanan dan rentang nilainya -

Tipe Ukuran penyimpanan Rentang nilai
arang 1 byte -128 hingga 127 atau 0 hingga 255
unsigned char 1 byte 0 sampai 255
karakter bertanda tangan 1 byte -128 hingga 127
int 2 atau 4 byte -32,768 hingga 32,767 atau -2,147,483,648 hingga 2,147,483,647
unsigned int 2 atau 4 byte 0 hingga 65.535 atau 0 hingga 4.294.967.295
pendek 2 byte -32.768 hingga 32.767
pendek unsigned 2 byte 0 hingga 65.535
panjang 4 byte -2.147.483.648 hingga 2.147.483.647
unsigned long 4 byte 0 sampai 4.294.967.295

Untuk mendapatkan ukuran yang tepat dari suatu jenis atau variabel pada platform tertentu, Anda dapat menggunakan sizeofoperator. Ukuran ekspresi (tipe) menghasilkan ukuran penyimpanan objek atau tipe dalam byte. Berikut adalah contoh untuk mendapatkan ukuran tipe int pada mesin apa pun -

#import <Foundation/Foundation.h>

int main() {
   NSLog(@"Storage size for int : %d \n", sizeof(int));
   return 0;
}

Ketika Anda mengkompilasi dan menjalankan program di atas, ini menghasilkan hasil sebagai berikut di Linux -

2013-09-07 22:21:39.155 demo[1340] Storage size for int : 4

Jenis Titik Mengambang

Tabel berikut memberi Anda detail tentang tipe float-point standar dengan ukuran penyimpanan dan rentang nilai serta presisi mereka -

Tipe Ukuran penyimpanan Rentang nilai Presisi
mengapung 4 byte 1.2E-38 hingga 3.4E + 38 6 tempat desimal
dua kali lipat 8 byte 2.3E-308 hingga 1.7E + 308 15 tempat desimal
ganda panjang 10 byte 3.4E-4932 hingga 1.1E + 4932 19 tempat desimal

File header float.h mendefinisikan makro yang memungkinkan Anda menggunakan nilai-nilai ini dan detail lainnya tentang representasi biner dari bilangan real dalam program Anda. Contoh berikut akan mencetak ruang penyimpanan yang diambil oleh tipe float dan nilai jangkauannya -

#import <Foundation/Foundation.h>

int main() {
   NSLog(@"Storage size for float : %d \n", sizeof(float));
   return 0;
}

Ketika Anda mengkompilasi dan menjalankan program di atas, ini menghasilkan hasil sebagai berikut di Linux -

2013-09-07 22:22:21.729 demo[3927] Storage size for float : 4

Jenis void

Jenis kekosongan menentukan bahwa tidak ada nilai yang tersedia. Ini digunakan dalam tiga jenis situasi -

Sr.No. Jenis dan Deskripsi
1 Function returns as void

Ada berbagai fungsi di Objective-C yang tidak mengembalikan nilai atau bisa dibilang mereka mengembalikan void. Fungsi tanpa nilai pengembalian memiliki tipe pengembalian sebagai kosong. Sebagai contoh,void exit (int status);

2 Function arguments as void

Ada berbagai fungsi di Objective-C yang tidak menerima parameter apa pun. Fungsi tanpa parameter dapat diterima sebagai kekosongan. Sebagai contoh,int rand(void);

Jenis kekosongan mungkin belum Anda pahami saat ini, jadi mari kita lanjutkan dan kami akan membahas konsep-konsep ini di bab-bab selanjutnya.

Variabel tidak lain adalah nama yang diberikan ke area penyimpanan yang dapat dimanipulasi oleh program kami. Setiap variabel di Objective-C memiliki tipe tertentu, yang menentukan ukuran dan tata letak memori variabel; kisaran nilai yang dapat disimpan dalam memori itu; dan set operasi yang dapat diterapkan ke variabel.

Nama variabel dapat terdiri dari huruf, angka, dan karakter garis bawah. Ini harus dimulai dengan huruf atau garis bawah. Huruf besar dan kecil berbeda karena Objective-C peka huruf besar kecil. Berdasarkan tipe dasar yang dijelaskan pada bab sebelumnya, akan ada tipe variabel dasar berikut -

Sr.No. Jenis & Deskripsi
1

char

Biasanya satu oktet (satu byte). Ini adalah tipe integer.

2

int

Ukuran bilangan bulat paling alami untuk mesin.

3

float

Nilai floating point presisi tunggal.

4

double

Nilai floating point presisi ganda.

5

void

Merupakan ketiadaan tipe.

Bahasa pemrograman Objective-C juga memungkinkan untuk mendefinisikan berbagai jenis variabel lain, yang akan kita bahas di bab-bab selanjutnya seperti Enumerasi, Pointer, Array, Structure, Union, dll. Untuk bab ini, mari kita pelajari hanya tipe variabel dasar.

Definisi Variabel dalam Objective-C

Definisi variabel berarti memberi tahu compiler di mana dan berapa banyak untuk membuat penyimpanan untuk variabel. Definisi variabel menentukan tipe data dan berisi daftar satu atau lebih variabel dari tipe itu sebagai berikut -

type variable_list;

Sini, type harus berupa tipe data Objective-C yang valid termasuk char, w_char, int, float, double, bool atau objek yang ditentukan pengguna, dll., dan variable_listdapat terdiri dari satu atau lebih nama pengenal yang dipisahkan dengan koma. Beberapa pernyataan valid ditampilkan di sini -

int    i, j, k;
char   c, ch;
float  f, salary;
double d;

Garis int i, j, k;keduanya mendeklarasikan dan mendefinisikan variabel i, j dan k; yang menginstruksikan kompilator untuk membuat variabel bernama i, j dan k dengan tipe int.

Variabel dapat diinisialisasi (diberi nilai awal) dalam deklarasi mereka. Penginisialisasi terdiri dari tanda sama dengan diikuti dengan ekspresi konstan sebagai berikut -

type variable_name = value;

Beberapa contohnya adalah -

extern int d = 3, f = 5;    // declaration of d and f. 
int d = 3, f = 5;           // definition and initializing d and f. 
byte z = 22;                // definition and initializes z. 
char x = 'x';               // the variable x has the value 'x'.

Untuk definisi tanpa penginisialisasi: variabel dengan durasi penyimpanan statis secara implisit diinisialisasi dengan NULL (semua byte memiliki nilai 0); nilai awal dari semua variabel lainnya tidak ditentukan.

Deklarasi Variabel di Objective-C

Deklarasi variabel memberikan jaminan kepada kompilator bahwa ada satu variabel yang ada dengan tipe dan nama yang diberikan sehingga kompilator melanjutkan kompilasi lebih lanjut tanpa memerlukan detail lengkap tentang variabel tersebut. Deklarasi variabel memiliki arti pada saat kompilasi saja, kompilator membutuhkan deklarasi variabel aktual pada saat menautkan program.

Deklarasi variabel berguna ketika Anda menggunakan banyak file dan Anda menentukan variabel Anda di salah satu file, yang akan tersedia pada saat menautkan program. Anda akan menggunakanexternkata kunci untuk mendeklarasikan variabel di sembarang tempat. Meskipun Anda dapat mendeklarasikan variabel beberapa kali dalam program Objective-C Anda, tetapi variabel hanya dapat didefinisikan sekali dalam file, fungsi, atau blok kode.

Contoh

Coba contoh berikut, di mana variabel telah dideklarasikan di bagian atas, tetapi mereka telah ditentukan dan diinisialisasi di dalam fungsi utama -

#import <Foundation/Foundation.h>

// Variable declaration:
extern int a, b;
extern int c;
extern float f;

int main () {
  /* variable definition: */
  int a, b;
  int c;
  float f;
 
  /* actual initialization */
  a = 10;
  b = 20;
  
  c = a + b;
  NSLog(@"value of c : %d \n", c);

  f = 70.0/3.0;
  NSLog(@"value of f : %f \n", f);
 
  return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-07 22:43:31.695 demo[14019] value of c : 30 
2013-09-07 22:43:31.695 demo[14019] value of f : 23.333334

Konsep yang sama berlaku pada deklarasi fungsi di mana Anda memberikan nama fungsi pada saat deklarasinya dan definisi sebenarnya dapat diberikan di tempat lain. Dalam contoh berikut, dijelaskan menggunakan fungsi C dan seperti yang Anda ketahui Objective-C mendukung fungsi gaya C juga -

// function declaration
int func();

int main() {
   // function call
   int i = func();
}

// function definition
int func() {
   return 0;
}

Lvalues ​​dan Rvalues ​​di Objective-C

Ada dua jenis ekspresi di Objective-C -

  • lvalue- Ekspresi yang merujuk ke lokasi memori disebut ekspresi "lvalue". Nilai l dapat muncul sebagai sisi kiri atau kanan tugas.

  • rvalue- Istilah rvalue mengacu pada nilai data yang disimpan di beberapa alamat di memori. Nilai r adalah ekspresi yang tidak dapat memiliki nilai yang ditetapkan padanya yang berarti nilai r dapat muncul di sisi kanan tetapi tidak di sisi kiri tugas.

Variabel adalah lvalues ​​dan mungkin muncul di sisi kiri tugas. Literal numerik adalah nilai r sehingga mungkin tidak ditetapkan dan tidak dapat muncul di sisi kiri. Berikut ini adalah pernyataan yang valid -

int g = 20;

Tetapi berikut ini bukanlah pernyataan yang valid dan akan menghasilkan kesalahan waktu kompilasi -

10 = 20;

Konstanta mengacu pada nilai tetap yang tidak boleh diubah oleh program selama eksekusinya. Nilai tetap ini juga disebutliterals.

Konstanta dapat berupa salah satu tipe data dasar seperti konstanta integer, konstanta mengambang, konstanta karakter, atau literal string . Ada juga konstanta pencacahan.

Itu constants diperlakukan seperti variabel biasa kecuali nilainya tidak dapat diubah setelah definisinya.

Literal bilangan bulat

Literal bilangan bulat dapat berupa konstanta desimal, oktal, atau heksadesimal. Awalan menentukan basis atau radix: 0x atau 0X untuk heksadesimal, 0 untuk oktal, dan tidak ada untuk desimal.

Literal integer juga dapat memiliki sufiks yang merupakan kombinasi dari U dan L, masing-masing untuk unsigned dan long. Sufiks dapat berupa huruf besar atau kecil dan dapat dalam urutan apa pun.

Berikut adalah beberapa contoh literal integer -

212         /* Legal */
215u        /* Legal */
0xFeeL      /* Legal */
078         /* Illegal: 8 is not an octal digit */
032UU       /* Illegal: cannot repeat a suffix */

Berikut adalah contoh lain dari berbagai jenis literal Integer -

85         /* decimal */
0213       /* octal */
0x4b       /* hexadecimal */
30         /* int */
30u        /* unsigned int */
30l        /* long */
30ul       /* unsigned long */

Literal titik mengambang

Literal floating-point memiliki bagian bilangan bulat, titik desimal, bagian pecahan, dan bagian eksponen. Anda dapat merepresentasikan literal floating point baik dalam bentuk desimal atau eksponensial.

Saat merepresentasikan menggunakan bentuk desimal, Anda harus menyertakan titik desimal, eksponen, atau keduanya dan saat merepresentasikan menggunakan bentuk eksponensial, Anda harus menyertakan bagian bilangan bulat, bagian pecahan, atau keduanya. Eksponen bertanda tangan dikenalkan oleh e atau E.

Berikut beberapa contoh literal floating-point -

3.14159       /* Legal */
314159E-5L    /* Legal */
510E          /* Illegal: incomplete exponent */
210f          /* Illegal: no decimal or exponent */
.e55          /* Illegal: missing integer or fraction */

Konstanta karakter

Literal karakter diapit tanda kutip tunggal misalnya, 'x' dan dapat disimpan dalam variabel sederhana char Tipe.

Literal karakter dapat berupa karakter biasa (mis., 'X'), urutan escape (mis., '\ T'), atau karakter universal (mis., '\ U02C0').

Ada beberapa karakter dalam C ketika mereka dilanjutkan dengan garis miring terbalik mereka akan memiliki arti khusus dan mereka digunakan untuk mewakili seperti baris baru (\ n) atau tab (\ t). Di sini, Anda memiliki daftar beberapa kode urutan pelolosan tersebut -

Urutan pelarian Berarti
\\ \ karakter
\ ' 'karakter
\ " "karakter
\? ? karakter
\Sebuah Peringatan atau bel
\ b Menghapus
\ f Bentuk pakan
\ n Garis baru
\ r Kereta kembali
\ t Tab horizontal
\ v Tab vertikal
\ ooo Nomor oktal satu sampai tiga digit
\ xhh. . . Bilangan heksadesimal dari satu atau lebih digit

Berikut adalah contoh untuk menunjukkan beberapa karakter urutan melarikan diri -

#import <Foundation/Foundation.h>

int main() {
   NSLog(@"Hello\tWorld\n\n");
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-07 22:17:17.923 demo[17871] Hello	World

String literal

Literal atau konstanta string diapit tanda kutip ganda "". Sebuah string berisi karakter yang mirip dengan literal karakter: karakter biasa, urutan escape, dan karakter universal.

Anda dapat memecah garis panjang menjadi beberapa baris menggunakan literal string dan memisahkannya menggunakan spasi.

Berikut beberapa contoh literal string. Ketiga bentuk tersebut adalah string yang identik.

"hello, dear"

"hello, \

dear"

"hello, " "d" "ear"

Mendefinisikan Konstanta

Ada dua cara sederhana di C untuk mendefinisikan konstanta -

  • Menggunakan #define preprocessor.

  • Menggunakan const kata kunci.

#Define Preprocessor

Berikut adalah formulir yang digunakan #define preprocessor untuk mendefinisikan sebuah konstanta -

#define identifier value

Contoh berikut menjelaskannya secara rinci -

#import <Foundation/Foundation.h>

#define LENGTH 10   
#define WIDTH  5
#define NEWLINE '\n'

int main() {
   int area;
   area = LENGTH * WIDTH;
   NSLog(@"value of area : %d", area);
   NSLog(@"%c", NEWLINE);

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-07 22:18:16.637 demo[21460] value of area : 50
2013-09-07 22:18:16.638 demo[21460]

Kata kunci const

Kamu dapat memakai const prefiks untuk mendeklarasikan konstanta dengan tipe tertentu sebagai berikut -

const type variable = value;

Contoh berikut menjelaskannya secara rinci -

#import <Foundation/Foundation.h>

int main() {
   const int  LENGTH = 10;
   const int  WIDTH  = 5;
   const char NEWLINE = '\n';
   int area;  
   
   area = LENGTH * WIDTH;
   NSLog(@"value of area : %d", area);
   NSLog(@"%c", NEWLINE);

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-07 22:19:24.780 demo[25621] value of area : 50
2013-09-07 22:19:24.781 demo[25621]

Perhatikan bahwa ini adalah praktik pemrograman yang baik untuk mendefinisikan konstanta dalam MODAL.

Operator adalah simbol yang memberi tahu kompiler untuk melakukan manipulasi matematika atau logika tertentu. Bahasa Objective-C kaya akan operator bawaan dan menyediakan jenis operator berikut -

  • Operator Aritmatika
  • Operator Relasional
  • Operator Logis
  • Operator Bitwise
  • Operator Penugasan
  • Operator Misc

Tutorial ini akan menjelaskan aritmatika, relasional, logika, bitwise, penugasan dan operator lainnya satu per satu.

Operator Aritmatika

Tabel berikut menunjukkan semua operator aritmatika yang didukung oleh bahasa Objective-C. Asumsikan variabelA memegang 10 dan variabel B memegang 20, lalu -

Tunjukkan Contoh

Operator Deskripsi Contoh
+ Menambahkan dua operan A + B akan menghasilkan 30
- Mengurangi operan kedua dari yang pertama A - B akan memberi -10
* Menggandakan kedua operan A * B akan memberi 200
/ Membagi pembilang dengan penyebut B / A akan memberi 2
% Modulus Operator dan sisa setelah pembagian integer B% A akan memberi 0
++ Operator increment meningkatkan nilai integer satu A ++ akan memberikan 11
- Operator pengurangan mengurangi nilai integer satu A-- akan memberi 9

Operator Relasional

Tabel berikut menunjukkan semua operator relasional yang didukung oleh bahasa Objective-C. Asumsikan variabelA memegang 10 dan variabel B memegang 20, lalu -

Tunjukkan Contoh

Operator Deskripsi Contoh
== Memeriksa apakah nilai dari dua operan sama atau tidak; jika ya, maka kondisi menjadi benar. (A == B) tidak benar.
! = Memeriksa apakah nilai dari dua operan sama atau tidak; jika nilai tidak sama, maka kondisi menjadi benar. (A! = B) benar.
> Memeriksa apakah nilai operan kiri lebih besar dari nilai operan kanan; jika ya, maka kondisi menjadi benar. (A> B) tidak benar.
< Memeriksa apakah nilai operan kiri kurang dari nilai operan kanan; jika ya, maka kondisi menjadi benar. (A <B) benar.
> = Memeriksa apakah nilai operan kiri lebih besar dari atau sama dengan nilai operan kanan; jika ya, maka kondisi menjadi benar. (A> = B) tidak benar.
<= Memeriksa apakah nilai operan kiri kurang dari atau sama dengan nilai operan kanan; jika ya, maka kondisi menjadi benar. (A <= B) benar.

Operator Logis

Tabel berikut menunjukkan semua operator logika yang didukung oleh bahasa Objective-C. Asumsikan variabelA memegang 1 dan variabel B memegang 0, lalu -

Tunjukkan Contoh

Operator Deskripsi Contoh
&& Disebut Logical AND operator. Jika kedua operan bukan nol maka kondisi menjadi benar. (A && B) salah.
|| Disebut Logical OR Operator. Jika salah satu dari dua operan bukan nol maka kondisi menjadi benar. (A || B) itu benar.
! Disebut Logical NOT Operator. Gunakan untuk membalikkan keadaan logis operannya. Jika kondisi benar, maka operator NOT akan membuat salah. ! (A && B) benar.

Operator Bitwise

Operator bitwise bekerja pada bit dan melakukan operasi bit demi bit. Tabel kebenaran untuk &, |, dan ^ adalah sebagai berikut -

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

Asumsikan jika A = 60; dan B = 13; sekarang dalam format biner mereka akan menjadi sebagai berikut -

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A | B = 0011 1101

A ^ B = 0011 0001

~ A = 1100 0011

Operator Bitwise yang didukung oleh bahasa Objective-C tercantum dalam tabel berikut. Asumsikan variabel A memiliki 60 dan variabel B memiliki 13 maka -

Tunjukkan Contoh

Operator Deskripsi Contoh
& Biner AND Operator menyalin sedikit ke hasil jika ada di kedua operan. (A & B) akan menghasilkan 12, yaitu 0000 1100
| Biner ATAU Operator menyalin sedikit jika ada di salah satu operan. (A | B) akan menghasilkan 61, yaitu 0011 1101
^ Operator Biner XOR menyalin bit jika diatur dalam satu operan tetapi tidak keduanya. (A ^ B) akan menghasilkan 49, yaitu 0011 0001
~ Operator Pelengkap Binary Ones adalah unary dan memiliki efek bit 'membalik'. (~ A) akan memberikan -61, yaitu 1100 0011 dalam bentuk komplemen 2.
<< Operator Binary Left Shift. Nilai operan kiri dipindahkan ke kiri dengan jumlah bit yang ditentukan oleh operan kanan. A << 2 akan menghasilkan 240, yaitu 1111 0000
>> Operator Pergeseran Kanan Biner. Nilai operan kiri dipindahkan ke kanan dengan jumlah bit yang ditentukan oleh operan kanan. A >> 2 akan menghasilkan 15, yaitu 0000 1111

Operator Penugasan

Ada operator penugasan berikut yang didukung oleh bahasa Objective-C -

Tunjukkan Contoh

Operator Deskripsi Contoh
= Operator penugasan sederhana, Menetapkan nilai dari operan sisi kanan ke operan sisi kiri C = A + B akan memberikan nilai A + B ke dalam C
+ = Tambahkan AND operator penugasan, Ini menambahkan operan kanan ke operan kiri dan memberikan hasilnya ke operan kiri C + = A ekivalen dengan C = C + A
- = Kurangi AND operator penugasan, Ini mengurangi operan kanan dari operan kiri dan memberikan hasilnya ke operan kiri C - = A ekivalen dengan C = C - A
* = Kalikan DAN operator penugasan, Ini mengalikan operan kanan dengan operan kiri dan memberikan hasilnya ke operan kiri C * = A ekivalen dengan C = C * A
/ = Bagi AND operator penugasan, Ini membagi operan kiri dengan operan kanan dan memberikan hasilnya ke operan kiri C / = A ekivalen dengan C = C / A
% = Modulus AND operator penugasan, Dibutuhkan modulus menggunakan dua operan dan memberikan hasilnya ke operan kiri C% = A setara dengan C = C% A
<< = Pergeseran kiri DAN operator penugasan C << = 2 sama dengan C = C << 2
>> = Shift kanan DAN operator penugasan C >> = 2 sama dengan C = C >> 2
& = Bitwise AND operator penugasan C & = 2 sama dengan C = C & 2
^ = bitwise eksklusif OR dan operator penugasan C ^ = 2 sama dengan C = C ^ 2
| = bitwise inklusif OR dan operator penugasan C | = 2 sama dengan C = C | 2

Operator Lain-lain ↦ ukuran & terner

Ada beberapa operator penting lainnya termasuk sizeof dan ? : didukung oleh Objective-C Language.

Tunjukkan Contoh

Operator Deskripsi Contoh
ukuran dari() Mengembalikan ukuran variabel. sizeof (a), di mana a adalah integer, akan menghasilkan 4.
& Menampilkan alamat variabel. &Sebuah; akan memberikan alamat sebenarnya dari variabel tersebut.
* Pointer ke variabel. *Sebuah; akan menunjuk ke variabel.
? : Ekspresi Bersyarat Jika Kondisi benar? Kemudian nilai X: Jika tidak, nilai Y

Operator Diutamakan di Objective-C

Prioritas operator menentukan pengelompokan istilah dalam ekspresi. Ini memengaruhi bagaimana ekspresi dievaluasi. Operator tertentu memiliki prioritas lebih tinggi daripada yang lain; misalnya, operator perkalian memiliki prioritas yang lebih tinggi daripada operator penjumlahan -

Misalnya, x = 7 + 3 * 2; di sini, x ditetapkan 13, bukan 20 karena operator * memiliki prioritas lebih tinggi dari +, jadi pertama-tama dikalikan dengan 3 * 2 dan kemudian dijumlahkan menjadi 7.

Di sini, operator dengan prioritas tertinggi muncul di bagian atas tabel, operator dengan prioritas terendah muncul di bagian bawah. Dalam ekspresi, operator dengan prioritas lebih tinggi akan dievaluasi terlebih dahulu.

Kategori  Operator  Asosiatif 
Postfix  () [] ->. ++ - -   Kiri ke kanan 
Unary  + -! ~ ++ - - (tipe) * & sizeof  Kanan ke kiri 
Perkalian   * /%  Kiri ke kanan 
Aditif   + -  Kiri ke kanan 
Bergeser   << >>  Kiri ke kanan 
Relasional   <<=>> =  Kiri ke kanan 
Persamaan   ==! =  Kiri ke kanan 
Bitwise XOR  Kiri ke kanan 
Bitwise ATAU  Kiri ke kanan 
DAN logis  &&  Kiri ke kanan 
Logis ATAU  ||  Kiri ke kanan 
Bersyarat  ?:  Kanan ke kiri 
Tugas  = + = - = * = / =% = >> = << = & = ^ = | =  Kanan ke kiri 
Koma  Kiri ke kanan 

Mungkin ada situasi, ketika Anda perlu mengeksekusi blok kode beberapa kali. Secara umum, pernyataan dieksekusi secara berurutan: Pernyataan pertama dalam suatu fungsi dijalankan pertama, diikuti oleh yang kedua, dan seterusnya.

Bahasa pemrograman menyediakan berbagai struktur kontrol yang memungkinkan jalur eksekusi yang lebih rumit.

Pernyataan loop memungkinkan kita untuk mengeksekusi pernyataan atau sekelompok pernyataan beberapa kali dan berikut adalah bentuk umum dari pernyataan loop di sebagian besar bahasa pemrograman -

Bahasa pemrograman Objective-C menyediakan jenis loop berikut untuk menangani persyaratan perulangan. Klik tautan berikut untuk memeriksa detailnya.

Sr.No. Jenis & Deskripsi Loop
1 while loop

Mengulangi pernyataan atau sekelompok pernyataan saat kondisi tertentu benar. Ini menguji kondisi sebelum menjalankan badan perulangan.

2 untuk loop

Jalankan urutan pernyataan beberapa kali dan singkatkan kode yang mengelola variabel loop.

3 lakukan ... while loop

Seperti pernyataan while, kecuali pernyataan itu menguji kondisi di akhir badan perulangan.

4 loop bersarang

Anda dapat menggunakan satu atau lebih loop di dalam while lainnya, for atau do.. while loop.

Pernyataan Kontrol Loop

Pernyataan kontrol loop mengubah eksekusi dari urutan normalnya. Saat eksekusi meninggalkan ruang lingkup, semua objek otomatis yang dibuat dalam lingkup itu dimusnahkan.

Objective-C mendukung pernyataan kontrol berikut. Klik tautan berikut untuk memeriksa detailnya.

Sr.No. Pernyataan & Deskripsi Kontrol
1 pernyataan istirahat

Menghentikan loop atau switch pernyataan dan transfer eksekusi ke pernyataan segera setelah loop atau switch.

2 lanjutkan pernyataan

Menyebabkan loop melewatkan sisa tubuhnya dan segera menguji ulang kondisinya sebelum mengulangi.

Loop Tak Terbatas

Pengulangan menjadi pengulangan tanpa batas jika suatu kondisi tidak pernah menjadi salah. Ituforloop secara tradisional digunakan untuk tujuan ini. Karena tidak satu pun dari tiga ekspresi yang membentuk perulangan for diperlukan, Anda dapat membuat perulangan tanpa akhir dengan mengosongkan ekspresi kondisional.

#import <Foundation/Foundation.h>
 
int main () {

   for( ; ; ) {
      NSLog(@"This loop will run forever.\n");
   }

   return 0;
}

Jika ekspresi kondisional tidak ada, maka dianggap benar. Anda mungkin memiliki inisialisasi dan ekspresi inkremen, tetapi programmer Objective-C lebih sering menggunakan konstruksi for (;;) untuk menandai loop tak terbatas.

Struktur pengambilan keputusan mengharuskan pemrogram menentukan satu atau lebih kondisi untuk dievaluasi atau diuji oleh program, bersama dengan pernyataan atau pernyataan yang akan dieksekusi jika kondisi ditentukan benar, dan secara opsional, pernyataan lain akan dijalankan jika kondisinya ditentukan sebagai salah.

Berikut ini adalah bentuk umum dari struktur pengambilan keputusan khas yang ditemukan di sebagian besar bahasa pemrograman -

Bahasa pemrograman Objective-C mengasumsikan apa saja non-zero dan non-null nilai sebagai true, dan jika memang demikian zero atau null, maka diasumsikan sebagai false nilai.

Bahasa pemrograman Objective-C menyediakan jenis pernyataan pengambilan keputusan berikut. Klik tautan berikut untuk memeriksa detailnya -

Sr.No. Pernyataan & Deskripsi
1 jika pernyataan

Sebuah if statement terdiri dari ekspresi boolean yang diikuti oleh satu atau beberapa pernyataan.

2 jika ... pernyataan lain

Sebuah if statement bisa diikuti dengan opsional else statement, yang dijalankan jika ekspresi boolean salah.

3 pernyataan if bersarang

Anda bisa menggunakannya if atau else if pernyataan di dalam yang lain if atau else if pernyataan.

4 pernyataan switch

SEBUAH switch pernyataan memungkinkan variabel untuk diuji kesetaraan terhadap daftar nilai.

5 pernyataan saklar bersarang

Anda bisa menggunakannya switch pernyataan di dalam yang lain switch pernyataan.

Itu? : Operator

Kami telah meliputnya conditional operator ? : di bab sebelumnya yang bisa digunakan untuk menggantikan if...elsepernyataan. Ini memiliki bentuk umum berikut -

Exp1 ? Exp2 : Exp3;

Dimana Exp1, Exp2, dan Exp3 adalah ekspresi. Perhatikan penggunaan dan penempatan titik dua.

Nilai sebuah? ekspresi ditentukan seperti ini: Exp1 dievaluasi. Jika benar, maka Exp2 dievaluasi dan menjadi nilai keseluruhan? ekspresi. Jika Exp1 salah, maka Exp3 dievaluasi dan nilainya menjadi nilai ekspresi.

Fungsi adalah sekelompok pernyataan yang bersama-sama melakukan tugas. Setiap program Objective-C memiliki satu fungsi C, yaitumain(), dan semua program yang paling sepele dapat menentukan fungsi tambahan.

Anda dapat membagi kode Anda menjadi beberapa fungsi terpisah. Bagaimana Anda membagi kode Anda di antara fungsi yang berbeda terserah Anda, tetapi secara logis pembagian biasanya begitu setiap fungsi melakukan tugas tertentu.

Sebuah fungsi declarationmemberi tahu kompilator tentang nama fungsi, tipe kembalian, dan parameter. Sebuah fungsidefinition menyediakan tubuh sebenarnya dari fungsi tersebut.

Pada dasarnya di Objective-C, kami memanggil fungsi sebagai metode.

Kerangka kerja dasar Objective-C menyediakan banyak metode bawaan yang dapat dipanggil oleh program Anda. Misalnya, metodeappendString() untuk menambahkan string ke string lain.

Sebuah metode dikenal dengan berbagai nama seperti fungsi atau sub-rutin atau prosedur, dll.

Mendefinisikan Metode

Bentuk umum dari definisi metode dalam bahasa pemrograman Objective-C adalah sebagai berikut -

- (return_type) method_name:( argumentType1 )argumentName1 
joiningArgument2:( argumentType2 )argumentName2 ... 
joiningArgumentn:( argumentTypen )argumentNamen {
   body of the function
}

Definisi metode dalam bahasa pemrograman Objective-C terdiri dari header metode dan badan metode . Inilah semua bagian dari sebuah metode -

  • Return Type- Metode dapat mengembalikan nilai. Itureturn_typeadalah tipe data dari nilai yang dikembalikan fungsi. Beberapa metode melakukan operasi yang diinginkan tanpa mengembalikan nilai. Dalam kasus ini, return_type adalah kata kuncivoid.

  • Method Name- Ini adalah nama sebenarnya dari metode tersebut. Nama metode dan daftar parameter bersama-sama membentuk tanda tangan metode.

  • Arguments- Argumen seperti placeholder. Saat suatu fungsi dipanggil, Anda meneruskan nilai ke argumen. Nilai ini disebut sebagai parameter atau argumen aktual. Daftar parameter mengacu pada jenis, urutan, dan jumlah argumen dari suatu metode. Argumen bersifat opsional; artinya, suatu metode mungkin tidak berisi argumen.

  • Joining Argument - Argumen bergabung adalah untuk membuatnya lebih mudah dibaca dan membuatnya jelas saat memanggilnya.

  • Method Body - Tubuh metode berisi kumpulan pernyataan yang menentukan apa yang dilakukan metode.

Contoh

Berikut ini adalah kode sumber untuk metode yang dipanggil max(). Metode ini mengambil dua parameter num1 dan num2 dan mengembalikan maksimum antara keduanya -

/* function returning the max between two numbers */
- (int) max:(int) num1 secondNumber:(int) num2 {
   
   /* local variable declaration */
   int result;
 
   if (num1 > num2) {
      result = num1;
   } else {
      result = num2;
   }
 
   return result; 
}

Deklarasi Metode

Sebuah metode declarationmemberi tahu compiler tentang nama fungsi dan cara memanggil metode tersebut. Badan sebenarnya dari fungsi tersebut dapat ditentukan secara terpisah.

Deklarasi metode memiliki bagian-bagian berikut -

- (return_type) function_name:( argumentType1 )argumentName1 
joiningArgument2:( argumentType2 )argumentName2 ... 
joiningArgumentn:( argumentTypen )argumentNamen;

Untuk fungsi max () yang didefinisikan di atas, berikut adalah deklarasi metode -

-(int) max:(int)num1 andNum2:(int)num2;

Deklarasi metode diperlukan saat Anda menentukan metode dalam satu file sumber dan Anda memanggil metode itu di file lain. Dalam kasus seperti itu, Anda harus mendeklarasikan fungsi di bagian atas file yang memanggil fungsi tersebut.

Memanggil metode

Saat membuat metode Objective-C, Anda memberikan definisi tentang apa yang harus dilakukan fungsi tersebut. Untuk menggunakan metode, Anda harus memanggil fungsi itu untuk melakukan tugas yang ditentukan.

Ketika program memanggil suatu fungsi, kontrol program ditransfer ke metode yang dipanggil. Sebuah metode yang dipanggil melakukan tugas yang ditentukan, dan ketika pernyataan kembaliannya dijalankan atau ketika penjepit penutup akhir fungsinya tercapai, ia mengembalikan kontrol program kembali ke program utama.

Untuk memanggil metode, Anda hanya perlu meneruskan parameter yang diperlukan bersama dengan nama metode, dan jika metode mengembalikan nilai, Anda dapat menyimpan nilai yang dikembalikan. Misalnya -

#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
/* method declaration */
- (int)max:(int)num1 andNum2:(int)num2;
@end

@implementation SampleClass

/* method returning the max between two numbers */
- (int)max:(int)num1 andNum2:(int)num2 {

   /* local variable declaration */
   int result;
 
   if (num1 > num2) {
      result = num1;
   } else {
      result = num2;
   }
 
   return result; 
}

@end

int main () {
   
   /* local variable definition */
   int a = 100;
   int b = 200;
   int ret;
   
   SampleClass *sampleClass = [[SampleClass alloc]init];

   /* calling a method to get max value */
   ret = [sampleClass max:a andNum2:b];
 
   NSLog(@"Max value is : %d\n", ret );
   return 0;
}

Saya menyimpan fungsi max () bersama dengan fungsi main () dan mematuhi kode sumber. Saat menjalankan eksekusi akhir, itu akan menghasilkan hasil sebagai berikut -

2013-09-07 22:28:45.912 demo[26080] Max value is : 200

Argumen Fungsi

Jika suatu fungsi akan menggunakan argumen, ia harus mendeklarasikan variabel yang menerima nilai argumen. Variabel ini disebutformal parameters dari fungsinya.

Parameter formal berperilaku seperti variabel lokal lainnya di dalam fungsi dan dibuat saat masuk ke fungsi dan dimusnahkan saat keluar.

Saat memanggil suatu fungsi, ada dua cara argumen dapat diteruskan ke suatu fungsi -

Sr.No. Jenis & Deskripsi Panggilan
1 Panggilan berdasarkan nilai

Metode ini menyalin nilai sebenarnya dari sebuah argumen ke dalam parameter formal dari fungsi tersebut. Dalam kasus ini, perubahan yang dilakukan pada parameter di dalam fungsi tidak berpengaruh pada argumen.

2 Panggil dengan referensi

Metode ini menyalin alamat argumen ke dalam parameter formal. Di dalam fungsinya, alamat digunakan untuk mengakses argumen sebenarnya yang digunakan dalam panggilan. Ini berarti bahwa perubahan yang dilakukan pada parameter mempengaruhi argumen.

Secara default, Objective-C menggunakan call by valueuntuk menyampaikan argumen. Secara umum, ini berarti bahwa kode dalam suatu fungsi tidak dapat mengubah argumen yang digunakan untuk memanggil fungsi tersebut, dan contoh yang disebutkan di atas saat memanggil fungsi max () menggunakan metode yang sama.

Kelas Objective-C mendefinisikan objek yang menggabungkan data dengan perilaku terkait. Terkadang, masuk akal untuk mewakili satu tugas atau unit perilaku, daripada sekumpulan metode.

Blok adalah fitur tingkat bahasa yang ditambahkan ke C, Objective-C, dan C ++ yang memungkinkan Anda membuat segmen kode berbeda yang dapat diteruskan ke metode atau fungsi seolah-olah itu adalah nilai. Blok adalah objek Objective-C yang artinya bisa ditambahkan ke koleksi seperti NSArray atau NSDictionary. Mereka juga memiliki kemampuan untuk menangkap nilai dari lingkup yang melingkupinya, membuatnya mirip dengan closure atau lambda dalam bahasa pemrograman lain

Sintaks deklarasi blok sederhana

returntype (^blockName)(argumentType);

Implementasi blok sederhana

returntype (^blockName)(argumentType)= ^{
};

Berikut ini contoh sederhananya

void (^simpleBlock)(void) = ^{
   NSLog(@"This is a block");
};

Kita dapat meminta blok tersebut menggunakan

simpleBlock();

Memblokir Argumen dan Mengembalikan Nilai

Blok juga dapat mengambil argumen dan mengembalikan nilai seperti metode dan fungsi.

Berikut adalah contoh sederhana untuk mengimplementasikan dan memanggil blok dengan argumen dan mengembalikan nilai.

double (^multiplyTwoValues)(double, double) = 
   ^(double firstValue, double secondValue) {
      return firstValue * secondValue;
   };

double result = multiplyTwoValues(2,4); 
NSLog(@"The result is %f", result);

Blok menggunakan definisi tipe

Berikut adalah contoh sederhana menggunakan typedef di blok. Harap perhatikan contoh inidoesn't work di online compileruntuk sekarang. MenggunakanXCode untuk menjalankan hal yang sama.

#import <Foundation/Foundation.h>

typedef void (^CompletionBlock)();
@interface SampleClass:NSObject
- (void)performActionWithCompletion:(CompletionBlock)completionBlock;
@end

@implementation SampleClass

- (void)performActionWithCompletion:(CompletionBlock)completionBlock {

   NSLog(@"Action Performed");
   completionBlock();
}

@end

int main() {
   
   /* my first program in Objective-C */
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass performActionWithCompletion:^{
      NSLog(@"Completion is called to intimate action is performed.");
   }];

   return 0;
}

Mari kita kompilasi dan jalankan, itu akan menghasilkan hasil sebagai berikut -

2013-09-10 08:13:57.155 demo[284:303] Action Performed
2013-09-10 08:13:57.157 demo[284:303] Completion is called to intimate action is performed.

Blok lebih banyak digunakan di aplikasi iOS dan Mac OS X. Jadi lebih penting untuk memahami penggunaan blok.

Dalam bahasa pemrograman Objective-C, untuk menyimpan tipe data dasar seperti int, float, bool dalam bentuk objek,

Objective-C menyediakan berbagai metode untuk bekerja dengan NSNumber dan yang penting tercantum dalam tabel berikut.

Sr.No. Metode & Deskripsi
1

+ (NSNumber *)numberWithBool:(BOOL)value

Membuat dan mengembalikan objek NSNumber yang berisi nilai tertentu, memperlakukannya sebagai BOOL.

2

+ (NSNumber *)numberWithChar:(char)value

Membuat dan mengembalikan objek NSNumber yang berisi nilai tertentu, memperlakukannya sebagai karakter bertanda.

3

+ (NSNumber *)numberWithDouble:(double)value

Membuat dan mengembalikan objek NSNumber yang berisi nilai tertentu, memperlakukannya sebagai ganda.

4

+ (NSNumber *)numberWithFloat:(float)value

Membuat dan mengembalikan objek NSNumber yang berisi nilai tertentu, memperlakukannya sebagai float.

5

+ (NSNumber *)numberWithInt:(int)value

Membuat dan mengembalikan objek NSNumber yang berisi nilai tertentu, memperlakukannya sebagai int bertanda tangan.

6

+ (NSNumber *)numberWithInteger:(NSInteger)value

Membuat dan mengembalikan objek NSNumber yang berisi nilai tertentu, memperlakukannya sebagai NSInteger.

7

- (BOOL)boolValue

Mengembalikan nilai penerima sebagai BOOL.

8

- (char)charValue

Mengembalikan nilai penerima sebagai karakter.

9

- (double)doubleValue

Mengembalikan nilai penerima sebagai ganda.

10

- (float)floatValue

Mengembalikan nilai penerima sebagai pelampung.

11

- (NSInteger)integerValue

Mengembalikan nilai penerima sebagai NSInteger.

12

- (int)intValue

Mengembalikan nilai penerima sebagai int.

13

- (NSString *)stringValue

Mengembalikan nilai penerima sebagai string yang dapat dibaca manusia.

Berikut adalah contoh sederhana untuk menggunakan NSNumber yang mengalikan dua angka dan mengembalikan produk.

#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
- (NSNumber *)multiplyA:(NSNumber *)a withB:(NSNumber *)b;
@end

@implementation SampleClass

- (NSNumber *)multiplyA:(NSNumber *)a withB:(NSNumber *)b {
   float number1 = [a floatValue];
   float number2 = [b floatValue];
   float product = number1 * number2;
   NSNumber *result = [NSNumber numberWithFloat:product];
   return result;
}

@end

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

   SampleClass *sampleClass = [[SampleClass alloc]init];
   NSNumber *a = [NSNumber numberWithFloat:10.5];
   NSNumber *b = [NSNumber numberWithFloat:10.0];   
   NSNumber *result = [sampleClass multiplyA:a withB:b];
   NSString *resultString = [result stringValue];
   NSLog(@"The product is %@",resultString);

   [pool drain];
   return 0;
}

Sekarang ketika kita mengkompilasi dan menjalankan program, kita akan mendapatkan hasil sebagai berikut.

2013-09-14 18:53:40.575 demo[16787] The product is 105

Bahasa pemrograman Objective-C menyediakan struktur data yang disebut the array, yang dapat menyimpan kumpulan elemen berurutan ukuran tetap dari jenis yang sama. Sebuah array digunakan untuk menyimpan kumpulan data, tetapi seringkali lebih berguna untuk menganggap array sebagai kumpulan variabel dengan tipe yang sama.

Alih-alih mendeklarasikan variabel individual, seperti number0, number1, ..., dan number99, Anda mendeklarasikan satu variabel array seperti bilangan dan menggunakan bilangan [0], bilangan [1], dan ..., bilangan [99] untuk mewakili variabel individu. Elemen tertentu dalam array diakses oleh indeks.

Semua array terdiri dari lokasi memori yang berdekatan. Alamat terendah sesuai dengan elemen pertama dan alamat tertinggi untuk elemen terakhir.

Mendeklarasikan Array

Untuk mendeklarasikan sebuah array di Objective-C, programmer menentukan jenis elemen dan jumlah elemen yang dibutuhkan oleh sebuah array sebagai berikut:

type arrayName [ arraySize ];

Ini disebut larik berdimensi tunggal . ItuarraySize harus berupa konstanta bilangan bulat yang lebih besar dari nol dan typebisa berupa tipe data Objective-C yang valid. Misalnya, untuk mendeklarasikan array 10 elemen yang dipanggilbalance tipe ganda, gunakan pernyataan ini -

double balance[10];

Sekarang, keseimbangan adalah larik variabel, yang cukup untuk menampung hingga 10 angka ganda.

Menginisialisasi Array

Anda dapat menginisialisasi array di Objective-C satu per satu atau menggunakan satu pernyataan sebagai berikut -

double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};

Jumlah nilai di antara tanda kurung kurawal {} tidak boleh lebih besar dari jumlah elemen yang kita nyatakan untuk larik di antara tanda kurung siku []. Berikut adalah contoh untuk menetapkan satu elemen dari array -

Jika Anda menghilangkan ukuran array, array yang cukup besar untuk menampung inisialisasi akan dibuat. Karena itu, jika Anda menulis -

double balance[] = {1000.0, 2.0, 3.4, 17.0, 50.0};

Anda akan membuat larik yang persis sama seperti yang Anda lakukan di contoh sebelumnya.

balance[4] = 50.0;

Pernyataan di atas memberikan nomor elemen ke-5 dalam array nilai 50.0. Array dengan indeks ke-4 akan menjadi ke-5, yaitu elemen terakhir karena semua array memiliki 0 sebagai indeks dari elemen pertamanya yang disebut juga dengan indeks dasar. Berikut adalah representasi bergambar dari larik yang sama yang kita diskusikan di atas -

Mengakses Elemen Array

Sebuah elemen diakses dengan mengindeks nama array. Ini dilakukan dengan menempatkan indeks elemen dalam tanda kurung siku setelah nama array. Misalnya -

double salary = balance[9];

Pernyataan di atas akan mengambil elemen ke-10 dari array dan menetapkan nilainya ke variabel gaji. Berikut adalah contoh, yang akan menggunakan semua tiga konsep yang disebutkan di atas yaitu. deklarasi, tugas dan mengakses array -

#import <Foundation/Foundation.h>
 
int main () {
   int n[ 10 ];   /* n is an array of 10 integers */
   int i,j;
 
   /* initialize elements of array n to 0 */         
   for ( i = 0; i < 10; i++ ) {
      n[ i ] = i + 100;    /* set element at location i to i + 100 */
   }
   
   /* output each array element's value */
   for (j = 0; j < 10; j++ ) {
      NSLog(@"Element[%d] = %d\n", j, n[j] );
   }
 
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-14 01:24:06.669 demo[16508] Element[0] = 100
2013-09-14 01:24:06.669 demo[16508] Element[1] = 101
2013-09-14 01:24:06.669 demo[16508] Element[2] = 102
2013-09-14 01:24:06.669 demo[16508] Element[3] = 103
2013-09-14 01:24:06.669 demo[16508] Element[4] = 104
2013-09-14 01:24:06.669 demo[16508] Element[5] = 105
2013-09-14 01:24:06.669 demo[16508] Element[6] = 106
2013-09-14 01:24:06.669 demo[16508] Element[7] = 107
2013-09-14 01:24:06.669 demo[16508] Element[8] = 108
2013-09-14 01:24:06.669 demo[16508] Element[9] = 109

Objective-C Arrays in Detail

Array penting untuk Objective-C dan membutuhkan lebih banyak detail. Ada beberapa konsep penting yang terkait dengan array yang harus jelas bagi programmer Objective-C -

Sr.No. Konsep & Deskripsi
1 Array multi-dimensi

Objective-C mendukung array multidimensi. Bentuk paling sederhana dari larik multidimensi adalah larik dua dimensi.

2 Meneruskan array ke fungsi

Anda bisa meneruskan ke fungsi sebuah pointer ke sebuah array dengan menentukan nama array tanpa indeks.

3 Mengembalikan array dari suatu fungsi

Objective-C memungkinkan suatu fungsi untuk mengembalikan array.

4 Pointer ke sebuah array

Anda dapat menghasilkan pointer ke elemen pertama dari sebuah array hanya dengan menentukan nama array, tanpa indeks apapun.

Petunjuk di Objective-C mudah dan menyenangkan untuk dipelajari. Beberapa tugas pemrograman Objective-C dilakukan lebih mudah dengan pointer, dan tugas lain, seperti alokasi memori dinamis, tidak dapat dilakukan tanpa menggunakan pointer. Jadi penting untuk mempelajari pointer untuk menjadi programmer Objective-C yang sempurna. Mari mulai mempelajarinya dengan langkah-langkah sederhana dan mudah.

Seperti yang Anda ketahui, setiap variabel adalah lokasi memori dan setiap lokasi memori memiliki alamat yang ditentukan yang dapat diakses menggunakan operator ampersand (&), yang menunjukkan alamat dalam memori. Perhatikan contoh berikut, yang akan mencetak alamat dari variabel yang ditentukan -

#import <Foundation/Foundation.h>

int main () {
   int  var1;
   char var2[10];

   NSLog(@"Address of var1 variable: %x\n", &var1 );
   NSLog(@"Address of var2 variable: %x\n", &var2 );

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan sesuatu sebagai berikut -

2013-09-13 03:18:45.727 demo[17552] Address of var1 variable: 1c0843fc
2013-09-13 03:18:45.728 demo[17552] Address of var2 variable: 1c0843f0

Jadi, Anda mengerti apa itu alamat memori dan bagaimana mengaksesnya, jadi dasar konsepnya sudah berakhir. Sekarang mari kita lihat apa itu pointer.

Apa Itu Pointer?

SEBUAH pointeradalah variabel yang nilainya adalah alamat variabel lain, yaitu alamat langsung dari lokasi memori. Seperti variabel atau konstanta apa pun, Anda harus mendeklarasikan sebuah pointer sebelum Anda dapat menggunakannya untuk menyimpan alamat variabel apa pun. Bentuk umum dari deklarasi variabel pointer adalah -

type *var-name;

Sini, typeadalah tipe dasar pointer; itu harus merupakan tipe data Objective-C yang valid danvar-nameadalah nama variabel penunjuk. Tanda bintang * yang Anda gunakan untuk menyatakan penunjuk adalah tanda bintang yang sama dengan yang Anda gunakan untuk perkalian. Namun, dalam pernyataan ini tanda bintang digunakan untuk menunjukkan variabel sebagai penunjuk. Berikut adalah deklarasi pointer yang valid -

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

Tipe data sebenarnya dari nilai semua pointer, apakah integer, float, karakter, atau sebaliknya, adalah sama, angka heksadesimal panjang yang mewakili alamat memori. Satu-satunya perbedaan antara pointer dari tipe data yang berbeda adalah tipe data dari variabel atau konstanta yang ditunjuk pointer.

Bagaimana cara menggunakan Pointer?

Ada beberapa operasi penting, yang akan kami lakukan dengan bantuan petunjuk sangat sering. (a) kami mendefinisikan variabel pointer, (b) menetapkan alamat variabel ke pointer, dan (c)terakhir akses nilai di alamat yang tersedia di variabel pointer. Ini dilakukan dengan menggunakan operator unary*yang mengembalikan nilai variabel yang terletak di alamat yang ditentukan oleh operannya. Contoh berikut memanfaatkan operasi ini -

#import <Foundation/Foundation.h>

int main () {
   int  var = 20;    /* actual variable declaration */
   int  *ip;         /* pointer variable declaration */  
   ip = &var;       /* store address of var in pointer variable*/

   NSLog(@"Address of var variable: %x\n", &var  );

   /* address stored in pointer variable */
   NSLog(@"Address stored in ip variable: %x\n", ip );

   /* access the value using the pointer */
   NSLog(@"Value of *ip variable: %d\n", *ip );

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan sesuatu sebagai berikut -

2013-09-13 03:20:21.873 demo[24179] Address of var variable: 337ed41c
2013-09-13 03:20:21.873 demo[24179] Address stored in ip variable: 337ed41c
2013-09-13 03:20:21.874 demo[24179] Value of *ip variable: 20

Pointer NULL di Objective-C

Itu selalu merupakan praktik yang baik untuk menetapkan nilai NULL ke variabel pointer jika Anda tidak memiliki alamat yang tepat untuk ditetapkan. Ini dilakukan pada saat deklarasi variabel. Sebuah pointer yang diberi NULL disebut anull penunjuk.

Pointer NULL adalah konstanta dengan nilai nol yang ditentukan di beberapa pustaka standar. Pertimbangkan program berikut -

#import <Foundation/Foundation.h>

int main () {
   int  *ptr = NULL;
   NSLog(@"The value of ptr is : %x\n", ptr  );
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-13 03:21:19.447 demo[28027] The value of ptr is : 0

Di sebagian besar sistem operasi, program tidak diizinkan untuk mengakses memori di alamat 0 karena memori tersebut dicadangkan oleh sistem operasi. Bagaimanapun, alamat memori 0 memiliki arti khusus; itu menandakan bahwa penunjuk tidak dimaksudkan untuk menunjuk ke lokasi memori yang dapat diakses. Tetapi menurut kesepakatan, jika sebuah pointer berisi nilai null (nol), itu dianggap tidak mengarah ke apa-apa.

Untuk memeriksa null pointer, Anda dapat menggunakan pernyataan if sebagai berikut -

if(ptr)     /* succeeds if p is not null */
if(!ptr)    /* succeeds if p is null */

Pointer Objective-C dalam Detail

Pointer memiliki banyak konsep tetapi mudah dan sangat penting untuk pemrograman Objective-C. Ada beberapa konsep penunjuk penting berikut, yang harus jelas bagi programmer Objective-C -

Sr.No. Konsep & Deskripsi
1 Objective-C - Aritmatika penunjuk

Ada empat operator aritmatika yang dapat digunakan pada pointer: ++, -, +, -

2 Objective-C - Array pointer

Anda dapat menentukan array untuk menampung sejumlah pointer.

3 Objective-C - Arahkan ke penunjuk

Objective-C memungkinkan Anda untuk mengarahkan pointer ke pointer dan seterusnya.

4 Meneruskan pointer ke fungsi di Objective-C

Meneruskan argumen dengan referensi atau dengan alamat keduanya memungkinkan argumen yang diteruskan diubah dalam fungsi pemanggil oleh fungsi yang dipanggil.

5 Kembalikan penunjuk dari fungsi di Objective-C

Objective-C memungkinkan suatu fungsi untuk mengembalikan pointer ke variabel lokal, variabel statis, dan memori yang dialokasikan secara dinamis juga.

String dalam bahasa pemrograman Objective-C direpresentasikan menggunakan NSString dan subkelasnya NSMutableString menyediakan beberapa cara untuk membuat objek string. Cara termudah untuk membuat objek string adalah dengan menggunakan konstruksi Objective-C @ "..." -

NSString *greeting = @"Hello";

Contoh sederhana untuk membuat dan mencetak string ditunjukkan di bawah ini.

#import <Foundation/Foundation.h>

int main () {
   NSString *greeting = @"Hello";
   NSLog(@"Greeting message: %@\n", greeting );

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan sesuatu sebagai berikut -

2013-09-11 01:21:39.922 demo[23926] Greeting message: Hello

Objective-C mendukung berbagai metode untuk memanipulasi string -

Sr.No. Metode & Tujuan
1

- (NSString *)capitalizedString;

Mengembalikan representasi penerima dalam huruf besar.

2

- (unichar)characterAtIndex:(NSUInteger)index;

Mengembalikan karakter pada posisi larik tertentu.

3

- (double)doubleValue;

Mengembalikan nilai titik mengambang teks penerima sebagai ganda.

4

- (float)floatValue;

Mengembalikan nilai titik mengambang teks penerima sebagai pelampung.

5

- (BOOL)hasPrefix:(NSString *)aString;

Mengembalikan nilai Boolean yang menunjukkan apakah string yang diberikan cocok dengan karakter awal penerima.

6

- (BOOL)hasSuffix:(NSString *)aString;

Mengembalikan nilai Boolean yang menunjukkan apakah string yang diberikan cocok dengan karakter akhir penerima.

7

- (id)initWithFormat:(NSString *)format ...;

Mengembalikan objek NSString yang diinisialisasi dengan menggunakan string format tertentu sebagai templat di mana nilai argumen yang tersisa diganti.

8

- (NSInteger)integerValue;

Mengembalikan nilai NSInteger dari teks penerima.

9

- (BOOL)isEqualToString:(NSString *)aString;

Mengembalikan nilai Boolean yang menunjukkan apakah string yang diberikan sama dengan penerima menggunakan perbandingan berbasis Unicode literal.

10

- (NSUInteger)length;

Mengembalikan jumlah karakter Unicode di penerima.

11

- (NSString *)lowercaseString;

Mengembalikan representasi penerima dengan huruf kecil.

12

- (NSRange)rangeOfString:(NSString *)aString;

Menemukan dan mengembalikan kisaran kemunculan pertama dari string tertentu dalam penerima.

13

- (NSString *)stringByAppendingFormat:(NSString *)format ...;

Mengembalikan string yang dibuat dengan menambahkan ke penerima string yang dibangun dari string format tertentu dan argumen berikut.

14

- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;

Mengembalikan string baru yang dibuat dengan menghapus dari kedua ujung karakter penerima yang terdapat dalam kumpulan karakter tertentu.

15

- (NSString *)substringFromIndex:(NSUInteger)anIndex;

Mengembalikan string baru yang berisi karakter penerima dari yang ada di indeks tertentu sampai akhir.

Contoh berikut memanfaatkan beberapa fungsi yang disebutkan di atas -

#import <Foundation/Foundation.h>

int main () {
   NSString *str1 = @"Hello";
   NSString *str2 = @"World";
   NSString *str3;
   int  len ;

   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

   /* uppercase string */
   str3 = [str2 uppercaseString];
   NSLog(@"Uppercase String :  %@\n", str3 );

   /* concatenates str1 and str2 */
   str3 = [str1 stringByAppendingFormat:@"World"];
   NSLog(@"Concatenated string:   %@\n", str3 );

   /* total length of str3 after concatenation */
   len = [str3 length];
   NSLog(@"Length of Str3 :  %d\n", len );

   /* InitWithFormat */
   str3 = [[NSString alloc] initWithFormat:@"%@ %@",str1,str2];	
   NSLog(@"Using initWithFormat:   %@\n", str3 );
   [pool drain];

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan sesuatu sebagai berikut -

2013-09-11 01:15:45.069 demo[30378] Uppercase String :  WORLD
2013-09-11 01:15:45.070 demo[30378] Concatenated string:   HelloWorld
2013-09-11 01:15:45.070 demo[30378] Length of Str3 :  10
2013-09-11 01:15:45.070 demo[30378] Using initWithFormat:   Hello World

Anda dapat menemukan daftar lengkap metode terkait Objective-C NSString di Referensi Kelas NSString.

Array Objective-C memungkinkan Anda untuk mendefinisikan tipe variabel yang dapat menampung beberapa item data dari jenis yang sama tetapi structure adalah tipe data lain yang ditentukan pengguna yang tersedia dalam pemrograman Objective-C yang memungkinkan Anda menggabungkan item data dari berbagai jenis.

Struktur digunakan untuk merepresentasikan catatan, Misalkan Anda ingin melacak buku Anda di perpustakaan. Anda mungkin ingin melacak atribut berikut tentang setiap buku -

  • Title
  • Author
  • Subject
  • ID Buku

Mendefinisikan Struktur

Untuk menentukan struktur, Anda harus menggunakan structpernyataan. Pernyataan struct mendefinisikan tipe data baru, dengan lebih dari satu anggota untuk program Anda. Format pernyataan struct adalah ini -

struct [structure tag] {
   member definition;
   member definition;
   ...
   member definition;
} [one or more structure variables];

Itu structure tagbersifat opsional dan setiap definisi anggota adalah definisi variabel normal, seperti int i; atau float f; atau definisi variabel valid lainnya. Di akhir definisi struktur, sebelum titik koma terakhir, Anda dapat menentukan satu atau beberapa variabel struktur tetapi ini opsional. Inilah cara Anda mendeklarasikan struktur Buku -

struct Books {
   NSString *title;
   NSString *author;
   NSString *subject;
   int   book_id;
} book;

Mengakses Anggota Struktur

Untuk mengakses anggota struktur mana pun, kami menggunakan member access operator (.). Operator akses anggota dikodekan sebagai periode antara nama variabel struktur dan anggota struktur yang ingin kita akses. Anda akan menggunakanstructkata kunci untuk mendefinisikan variabel jenis struktur. Berikut adalah contoh untuk menjelaskan penggunaan struktur -

#import <Foundation/Foundation.h>

struct Books {
   NSString *title;
   NSString *author;
   NSString *subject;
   int   book_id;
};
 
int main() {
   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */
 
   /* book 1 specification */
   Book1.title = @"Objective-C Programming";
   Book1.author = @"Nuha Ali"; 
   Book1.subject = @"Objective-C Programming Tutorial";
   Book1.book_id = 6495407;

   /* book 2 specification */
   Book2.title = @"Telecom Billing";
   Book2.author = @"Zara Ali";
   Book2.subject = @"Telecom Billing Tutorial";
   Book2.book_id = 6495700;
 
   /* print Book1 info */
   NSLog(@"Book 1 title : %@\n", Book1.title);
   NSLog(@"Book 1 author : %@\n", Book1.author);
   NSLog(@"Book 1 subject : %@\n", Book1.subject);
   NSLog(@"Book 1 book_id : %d\n", Book1.book_id);

   /* print Book2 info */
   NSLog(@"Book 2 title : %@\n", Book2.title);
   NSLog(@"Book 2 author : %@\n", Book2.author);
   NSLog(@"Book 2 subject : %@\n", Book2.subject);
   NSLog(@"Book 2 book_id : %d\n", Book2.book_id);

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-14 04:20:07.947 demo[20591] Book 1 title : Objective-C Programming
2013-09-14 04:20:07.947 demo[20591] Book 1 author : Nuha Ali
2013-09-14 04:20:07.947 demo[20591] Book 1 subject : Objective-C Programming Tutorial
2013-09-14 04:20:07.947 demo[20591] Book 1 book_id : 6495407
2013-09-14 04:20:07.947 demo[20591] Book 2 title : Telecom Billing
2013-09-14 04:20:07.947 demo[20591] Book 2 author : Zara Ali
2013-09-14 04:20:07.947 demo[20591] Book 2 subject : Telecom Billing Tutorial
2013-09-14 04:20:07.947 demo[20591] Book 2 book_id : 6495700

Struktur sebagai Argumen Fungsi

Anda dapat mengirimkan struktur sebagai argumen fungsi dengan cara yang sangat mirip seperti Anda meneruskan variabel atau penunjuk lainnya. Anda akan mengakses variabel struktur dengan cara yang sama seperti yang Anda akses pada contoh di atas -

#import <Foundation/Foundation.h>

struct Books {
   NSString *title;
   NSString *author;
   NSString *subject;
   int   book_id;
};

@interface SampleClass:NSObject
/* function declaration */
- (void) printBook:( struct Books) book ;
@end

@implementation SampleClass 

- (void) printBook:( struct Books) book {
   NSLog(@"Book title : %@\n", book.title);
   NSLog(@"Book author : %@\n", book.author);
   NSLog(@"Book subject : %@\n", book.subject);
   NSLog(@"Book book_id : %d\n", book.book_id);
}

@end

int main() {
   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */
 
   /* book 1 specification */
   Book1.title = @"Objective-C Programming";
   Book1.author = @"Nuha Ali"; 
   Book1.subject = @"Objective-C Programming Tutorial";
   Book1.book_id = 6495407;

   /* book 2 specification */
   Book2.title = @"Telecom Billing";
   Book2.author = @"Zara Ali";
   Book2.subject = @"Telecom Billing Tutorial";
   Book2.book_id = 6495700;
 
   SampleClass *sampleClass = [[SampleClass alloc]init];
   /* print Book1 info */
   [sampleClass printBook: Book1];

   /* Print Book2 info */
   [sampleClass printBook: Book2];

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-14 04:34:45.725 demo[8060] Book title : Objective-C Programming
2013-09-14 04:34:45.725 demo[8060] Book author : Nuha Ali
2013-09-14 04:34:45.725 demo[8060] Book subject : Objective-C Programming Tutorial
2013-09-14 04:34:45.725 demo[8060] Book book_id : 6495407
2013-09-14 04:34:45.725 demo[8060] Book title : Telecom Billing
2013-09-14 04:34:45.725 demo[8060] Book author : Zara Ali
2013-09-14 04:34:45.725 demo[8060] Book subject : Telecom Billing Tutorial
2013-09-14 04:34:45.725 demo[8060] Book book_id : 6495700

Petunjuk ke Struktur

Anda dapat mendefinisikan pointer ke struktur dengan cara yang sangat mirip seperti Anda mendefinisikan pointer ke variabel lain sebagai berikut -

struct Books *struct_pointer;

Sekarang, Anda dapat menyimpan alamat variabel struktur di variabel penunjuk yang ditentukan di atas. Untuk menemukan alamat variabel struktur, letakkan operator & sebelum nama struktur sebagai berikut -

struct_pointer = &Book1;

Untuk mengakses anggota struktur menggunakan penunjuk ke struktur itu, Anda harus menggunakan operator -> sebagai berikut -

struct_pointer->title;

Mari kita tulis ulang contoh di atas dengan menggunakan pointer struktur, semoga ini memudahkan Anda untuk memahami konsepnya -

#import <Foundation/Foundation.h>

struct Books {
   NSString *title;
   NSString *author;
   NSString *subject;
   int   book_id;
};

@interface SampleClass:NSObject
/* function declaration */
- (void) printBook:( struct Books *) book ;
@end

@implementation SampleClass 
- (void) printBook:( struct Books *) book {
   NSLog(@"Book title : %@\n", book->title);
   NSLog(@"Book author : %@\n", book->author);
   NSLog(@"Book subject : %@\n", book->subject);
   NSLog(@"Book book_id : %d\n", book->book_id);
}

@end

int main() {
   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */
 
   /* book 1 specification */
   Book1.title = @"Objective-C Programming";
   Book1.author = @"Nuha Ali"; 
   Book1.subject = @"Objective-C Programming Tutorial";
   Book1.book_id = 6495407;

   /* book 2 specification */
   Book2.title = @"Telecom Billing";
   Book2.author = @"Zara Ali";
   Book2.subject = @"Telecom Billing Tutorial";
   Book2.book_id = 6495700;
 
   SampleClass *sampleClass = [[SampleClass alloc]init];
   /* print Book1 info by passing address of Book1 */
   [sampleClass printBook:&Book1];

   /* print Book2 info by passing address of Book2 */
   [sampleClass printBook:&Book2];

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-14 04:38:13.942 demo[20745] Book title : Objective-C Programming
2013-09-14 04:38:13.942 demo[20745] Book author : Nuha Ali
2013-09-14 04:38:13.942 demo[20745] Book subject : Objective-C Programming Tutorial
2013-09-14 04:38:13.942 demo[20745] Book book_id : 6495407
2013-09-14 04:38:13.942 demo[20745] Book title : Telecom Billing
2013-09-14 04:38:13.942 demo[20745] Book author : Zara Ali
2013-09-14 04:38:13.942 demo[20745] Book subject : Telecom Billing Tutorial
2013-09-14 04:38:13.942 demo[20745] Book book_id : 6495700

Bit Fields

Bit Fields memungkinkan pengemasan data dalam suatu struktur. Ini sangat berguna ketika memori atau penyimpanan data berada di premium. Contoh umum -

  • Mengemas beberapa objek menjadi kata mesin. misal, flag 1 bit dapat dipadatkan.

  • Membaca format file eksternal - format file non-standar dapat dibaca. Misalnya 9 bit integer.

Objective-C memungkinkan kita melakukan ini dalam definisi struktur dengan meletakkan: panjang bit setelah variabel. Misalnya -

struct packed_struct {
   unsigned int f1:1;
   unsigned int f2:1;
   unsigned int f3:1;
   unsigned int f4:1;
   unsigned int type:4;
   unsigned int my_int:9;
} pack;

Di sini, pack_struct berisi 6 anggota: Empat flag 1 bit f1..f3, tipe 4 bit dan 9 bit my_int.

Objective-C secara otomatis mengemas bidang bit di atas sekadat mungkin, asalkan panjang maksimum bidang kurang dari atau sama dengan panjang kata integer komputer. Jika ini tidak terjadi, maka beberapa kompiler mungkin mengizinkan memori tumpang tindih untuk bidang sementara yang lain akan menyimpan bidang berikutnya di kata berikutnya.

Itu Objective-C Preprocessorbukan bagian dari kompilator, tetapi merupakan langkah terpisah dalam proses kompilasi. Dalam istilah sederhana, Preprocessor Objective-C hanyalah alat substitusi teks dan menginstruksikan kompiler untuk melakukan pra-pemrosesan yang diperlukan sebelum kompilasi sebenarnya. Kami akan merujuk ke Preprocessor Objective-C sebagai OCPP.

Semua perintah preprocessor dimulai dengan simbol pagar (#). Ini harus merupakan karakter pertama yang tidak kosong, dan agar terbaca, petunjuk preprocessor harus dimulai di kolom pertama. Bagian berikut mencantumkan semua arahan preprocessor penting -

Sr.No. Petunjuk & Deskripsi
1

#define

Mengganti makro praprosesor

2

#include

Menyisipkan header tertentu dari file lain

3

#undef

Membatalkan definisi makro praprosesor

4

#ifdef

Mengembalikan nilai benar jika makro ini ditentukan

5

#ifndef

Mengembalikan nilai benar jika makro ini tidak ditentukan

6

#if

Menguji apakah kondisi waktu kompilasi benar

7

#else

Alternatif untuk #if

8

#elif

#else an #if dalam satu pernyataan

9

#endif

Mengakhiri praprosesor bersyarat

10

#error

Mencetak pesan kesalahan di stderr

11

#pragma

Mengeluarkan perintah khusus ke kompilator menggunakan metode standar

Contoh Preprocessor

Analisis contoh berikut untuk memahami berbagai arahan.

#define MAX_ARRAY_LENGTH 20

Direktif ini memberi tahu OCPP untuk mengganti contoh MAX_ARRAY_LENGTH dengan 20. Gunakan #define untuk konstanta untuk meningkatkan keterbacaan.

#import <Foundation/Foundation.h>
#include "myheader.h"

Arahan ini memberi tahu OCPP untuk mendapatkan foundation.h dari Foundation Frameworkdan tambahkan teks ke file sumber saat ini. Baris berikutnya memberi tahu OCPP untuk mendapatkanmyheader.h dari direktori lokal dan tambahkan konten ke file sumber saat ini.

#undef  FILE_SIZE
#define FILE_SIZE 42

Ini memberitahu OCPP untuk tidak mendefinisikan FILE_SIZE yang ada dan mendefinisikannya sebagai 42.

#ifndef MESSAGE
   #define MESSAGE "You wish!"
#endif

Ini memberitahu OCPP untuk mendefinisikan MESSAGE hanya jika MESSAGE belum ditentukan.

#ifdef DEBUG
   /* Your debugging statements here */
#endif

Ini memberitahu OCPP untuk melakukan proses pernyataan yang disertakan jika DEBUG ditentukan. Ini berguna jika Anda meneruskan tanda -DEBUG ke kompiler gcc pada saat kompilasi. Ini akan menentukan DEBUG, sehingga Anda dapat mengaktifkan dan menonaktifkan proses debug dengan cepat selama kompilasi.

Makro Standar

ANSI C mendefinisikan sejumlah makro. Meskipun masing-masing tersedia untuk Anda gunakan dalam pemrograman, makro yang telah ditentukan sebelumnya tidak boleh diubah secara langsung.

Sr.No. Makro & Deskripsi
1

__DATE__

Tanggal hari ini sebagai karakter literal dalam format "MMM DD YYYY"

2

__TIME__

Waktu saat ini sebagai literal karakter dalam format "HH: MM: SS"

3

__FILE__

Ini berisi nama file saat ini sebagai string literal.

4

__LINE__

Ini berisi nomor baris saat ini sebagai konstanta desimal.

5

__STDC__

Didefinisikan sebagai 1 jika kompilator mematuhi standar ANSI.

Mari coba contoh berikut -

#import <Foundation/Foundation.h>

int main() {
   NSLog(@"File :%s\n", __FILE__ );
   NSLog(@"Date :%s\n", __DATE__ );
   NSLog(@"Time :%s\n", __TIME__ );
   NSLog(@"Line :%d\n", __LINE__ );
   NSLog(@"ANSI :%d\n", __STDC__ );
   
   return 0;
}

Ketika kode di atas dalam sebuah file main.m dikompilasi dan dijalankan, ini menghasilkan hasil sebagai berikut -

2013-09-14 04:46:14.859 demo[20683] File :main.m
2013-09-14 04:46:14.859 demo[20683] Date :Sep 14 2013
2013-09-14 04:46:14.859 demo[20683] Time :04:46:14
2013-09-14 04:46:14.859 demo[20683] Line :8
2013-09-14 04:46:14.859 demo[20683] ANSI :1

Operator Preprocessor

Praprosesor Objective-C menawarkan operator berikut untuk membantu Anda membuat makro -

Kelanjutan Makro (\)

Makro biasanya harus berada dalam satu baris. Operator kelanjutan makro digunakan untuk melanjutkan makro yang terlalu panjang untuk satu baris. Misalnya -

#define  message_for(a, b)  \
   NSLog(@#a " and " #b ": We love you!\n")

Merangkai (#)

Operator stringize atau number-sign ('#'), ketika digunakan dalam definisi makro, mengubah parameter makro menjadi konstanta string. Operator ini dapat digunakan hanya dalam makro yang memiliki argumen atau daftar parameter tertentu. Misalnya -

#import <Foundation/Foundation.h>

#define  message_for(a, b)  \
   NSLog(@#a " and " #b ": We love you!\n")

int main(void) {
   message_for(Carole, Debra);
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-14 05:46:14.859 demo[20683] Carole and Debra: We love you!

Penempelan Token (##)

Operator penempelan token (##) dalam definisi makro menggabungkan dua argumen. Ini memungkinkan dua token terpisah dalam definisi makro untuk digabungkan menjadi satu token. Misalnya -

#import <Foundation/Foundation.h>

#define tokenpaster(n) NSLog (@"token" #n " = %d", token##n)

int main(void) {
   int token34 = 40;
   
   tokenpaster(34);
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-14 05:48:14.859 demo[20683] token34 = 40

Bagaimana itu terjadi, karena contoh ini menghasilkan keluaran aktual berikut dari preprocessor -

NSLog (@"token34 = %d", token34);

Contoh ini menunjukkan penggabungan token ## n menjadi token34 dan di sini kami telah menggunakan keduanya stringize dan token-pasting.

Operator yang ditentukan ()

Praprosesor definedoperator digunakan dalam ekspresi konstan untuk menentukan apakah pengenal didefinisikan menggunakan #define. Jika pengenal yang ditentukan ditentukan, nilainya adalah benar (bukan nol). Jika simbol tidak ditentukan, nilainya salah (nol). Operator yang ditentukan ditentukan sebagai berikut -

#import <Foundation/Foundation.h>

#if !defined (MESSAGE)
   #define MESSAGE "You wish!"
#endif

int main(void) {
   NSLog(@"Here is the message: %s\n", MESSAGE);  
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-14 05:48:19.859 demo[20683] Here is the message: You wish!

Makro Parameter

Salah satu fungsi yang kuat dari OCPP adalah kemampuan untuk mensimulasikan fungsi menggunakan makro berparameter. Misalnya, kita mungkin memiliki beberapa kode untuk mengkuadratkan angka sebagai berikut -

int square(int x) {
   return x * x;
}

Kita dapat menulis ulang kode di atas menggunakan makro sebagai berikut -

#define square(x) ((x) * (x))

Makro dengan argumen harus ditentukan menggunakan #definearahan sebelum dapat digunakan. Daftar argumen diapit tanda kurung dan harus segera mengikuti nama makro. Spasi tidak diperbolehkan antara nama makro dan kurung buka. Misalnya -

#import <Foundation/Foundation.h>

#define MAX(x,y) ((x) > (y) ? (x) : (y))

int main(void) {
   NSLog(@"Max between 20 and 10 is %d\n", MAX(10, 20));  
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-14 05:52:15.859 demo[20683] Max between 20 and 10 is 20

Bahasa pemrograman Objective-C menyediakan kata kunci yang disebut typedef, yang dapat Anda gunakan untuk memberi nama baru pada suatu jenis. Berikut adalah contoh untuk mendefinisikan sebuah istilahBYTE untuk nomor satu byte -

typedef unsigned char BYTE;

Setelah definisi tipe ini, pengidentifikasi BYTE dapat digunakan sebagai singkatan untuk tipe unsigned char, for example:.

BYTE  b1, b2;

Sesuai kesepakatan, huruf besar digunakan untuk definisi ini untuk mengingatkan pengguna bahwa nama jenis sebenarnya adalah singkatan simbolis, tetapi Anda dapat menggunakan huruf kecil, sebagai berikut -

typedef unsigned char byte;

Kamu dapat memakai typedefuntuk memberi nama pada tipe data yang ditentukan pengguna juga. Misalnya, Anda dapat menggunakan typedef with structure untuk menentukan tipe data baru dan kemudian menggunakan tipe data tersebut untuk mendefinisikan variabel struktur secara langsung sebagai berikut -

#import <Foundation/Foundation.h>

typedef struct Books {
   NSString *title;
   NSString *author;
   NSString *subject;
   int book_id;
} Book;
 
int main() {
   Book book;
   book.title = @"Objective-C Programming";
   book.author = @"TutorialsPoint";
   book.subject = @"Programming tutorial";
   book.book_id = 100;
   
   NSLog( @"Book title : %@\n", book.title);
   NSLog( @"Book author : %@\n", book.author);
   NSLog( @"Book subject : %@\n", book.subject);
   NSLog( @"Book Id : %d\n", book.book_id);

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-12 12:21:53.745 demo[31183] Book title : Objective-C Programming
2013-09-12 12:21:53.745 demo[31183] Book author : TutorialsPoint
2013-09-12 12:21:53.745 demo[31183] Book subject : Programming tutorial
2013-09-12 12:21:53.745 demo[31183] Book Id : 100

typedef vs #define

Itu #define adalah direktif Objective-C, yang juga digunakan untuk mendefinisikan alias untuk berbagai tipe data yang mirip dengan typedef tetapi dengan perbedaan berikut -

  • Itu typedef terbatas pada pemberian nama simbolik untuk tipe saja sedangkan #define dapat digunakan untuk mendefinisikan alias untuk nilai juga, seperti Anda dapat mendefinisikan 1 sebagai SATU, dll.

  • Itu typedef interpretasi dilakukan oleh kompilator dimana sebagai #define pernyataan diproses oleh pra-prosesor.

Berikut adalah penggunaan paling sederhana dari #define -

#import <Foundation/Foundation.h>
 
#define TRUE  1
#define FALSE 0
 
int main( ) {
   NSLog( @"Value of TRUE : %d\n", TRUE);
   NSLog( @"Value of FALSE : %d\n", FALSE);

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-12 12:23:37.993 demo[5160] Value of TRUE : 1
2013-09-12 12:23:37.994 demo[5160] Value of FALSE : 0

Jenis casting adalah cara untuk mengubah variabel dari satu jenis data ke jenis data lainnya. Misalnya, jika Anda ingin menyimpan nilai panjang menjadi bilangan bulat sederhana, Anda dapat mengetik cast long to int. Anda dapat mengonversi nilai dari satu jenis ke jenis lainnya secara eksplisit menggunakancast operator sebagai berikut -

(type_name) expression

Di Objective-C, kami biasanya menggunakan CGFloat untuk melakukan operasi floating point, yang diturunkan dari tipe dasar float dalam kasus 32-bit dan double dalam kasus 64-bit. Pertimbangkan contoh berikut di mana operator cast menyebabkan pembagian satu variabel integer dengan yang lain dilakukan sebagai operasi floating-point -

#import <Foundation/Foundation.h>

int main() {
   int sum = 17, count = 5;
   CGFloat mean;

   mean = (CGFloat) sum / count;
   NSLog(@"Value of mean : %f\n", mean );

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-11 01:35:40.047 demo[20634] Value of mean : 3.400000

Perlu dicatat di sini bahwa operator cor lebih diutamakan daripada pembagian, jadi nilai sum pertama kali diubah menjadi tipe double dan akhirnya dibagi dengan menghitung menghasilkan nilai ganda.

Jenis konversi bisa implisit yang dilakukan oleh kompilator secara otomatis atau dapat ditentukan secara eksplisit melalui penggunaan cast operator. Ini dianggap sebagai praktik pemrograman yang baik untuk menggunakan operator cor setiap kali konversi jenis diperlukan.

Promosi Integer

Promosi integer adalah proses dimana nilai tipe integer "lebih kecil" dari int atau unsigned int diubah menjadi int atau unsigned int. Pertimbangkan contoh menambahkan karakter di int -

#import <Foundation/Foundation.h>

int main() {
   int  i = 17;
   char c = 'c';  /* ascii value is 99 */
   int sum;

   sum = i + c;
   NSLog(@"Value of sum : %d\n", sum );

   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-11 01:38:28.492 demo[980] Value of sum : 116

Di sini, nilai jumlah menjadi 116 karena compiler sedang melakukan promosi integer dan mengubah nilai 'c' menjadi ascii sebelum melakukan operasi penjumlahan yang sebenarnya.

Konversi Aritmatika Biasa

Itu usual arithmetic conversionssecara implisit dilakukan untuk memberikan nilai mereka dalam tipe yang sama. Compiler pertama-tama melakukan promosi integer , jika operand masih memiliki tipe yang berbeda maka mereka akan dikonversi ke tipe yang muncul paling tinggi dalam hierarki berikut -

Konversi aritmatika biasa tidak dilakukan untuk operator penugasan, juga tidak untuk operator logika && dan ||. Mari kita ambil contoh berikut untuk memahami konsep -

#import <Foundation/Foundation.h>

int main() {
   int  i = 17;
   char c = 'c';  /* ascii value is 99 */
   CGFloat sum;

   sum = i + c;
   NSLog(@"Value of sum : %f\n", sum );
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-11 01:41:39.192 demo[15351] Value of sum : 116.000000

Di sini, sangat mudah untuk memahami bahwa c pertama diubah menjadi integer tetapi karena nilai akhir adalah float, jadi konversi aritmatika biasa berlaku dan compiler mengubah i dan c menjadi float dan menambahkannya menghasilkan hasil float.

Metode NSLog

Untuk mencetak log, kami menggunakan metode NSLog dalam bahasa pemrograman Objective-C yang telah kami gunakan langsung dari contoh Hello World.

Mari kita lihat kode sederhana yang akan mencetak kata "Hello World" -

#import <Foundation/Foundation.h>

int main() {
   NSLog(@"Hello, World! \n");
   return 0;
}

Sekarang, ketika kita mengkompilasi dan menjalankan program, kita akan mendapatkan hasil sebagai berikut.

2013-09-16 00:32:50.888 demo[16669] Hello, World!

Menonaktifkan log di aplikasi Live

Karena NSLog yang kita gunakan dalam aplikasi kita, itu akan dicetak di log perangkat dan tidak baik untuk mencetak log dalam pembuatan langsung. Karenanya, kami menggunakan definisi tipe untuk mencetak log dan kami dapat menggunakannya seperti yang ditunjukkan di bawah ini.

#import <Foundation/Foundation.h>

#if DEBUG == 0
#define DebugLog(...)
#elif DEBUG == 1
#define DebugLog(...) NSLog(__VA_ARGS__)
#endif

int main() {
   DebugLog(@"Debug log, our custom addition gets \
   printed during debug only" );
   NSLog(@"NSLog gets printed always" );     
   return 0;
}

Sekarang, ketika kita mengkompilasi dan menjalankan program dalam mode debug, kita akan mendapatkan hasil sebagai berikut.

2013-09-11 02:47:07.723 demo[618] Debug log, our custom addition gets printed during debug only
2013-09-11 02:47:07.723 demo[618] NSLog gets printed always

Sekarang, ketika kita mengkompilasi dan menjalankan program dalam mode rilis, kita akan mendapatkan hasil sebagai berikut.

2013-09-11 02:47:45.248 demo[3158] NSLog gets printed always

Dalam pemrograman Objective-C, penanganan error disediakan dengan kelas NSError yang tersedia di Foundation framework.

Objek NSError merangkum informasi kesalahan yang lebih kaya dan lebih dapat diperluas daripada yang mungkin hanya menggunakan kode kesalahan atau string kesalahan. Atribut inti objek NSError adalah domain kesalahan (diwakili oleh string), kode kesalahan khusus domain dan kamus info pengguna yang berisi informasi khusus aplikasi.

NSError

Program Objective-C menggunakan objek NSError untuk menyampaikan informasi tentang error runtime yang perlu diinformasikan kepada pengguna. Dalam kebanyakan kasus, program menampilkan informasi kesalahan ini dalam dialog atau sheet. Tetapi itu juga dapat menafsirkan informasi dan meminta pengguna untuk mencoba memulihkan dari kesalahan atau mencoba untuk memperbaiki kesalahan sendiri

Objek NSError terdiri dari -

  • Domain - Domain kesalahan dapat berupa salah satu domain NSError standar atau string arbitrer yang menjelaskan domain khusus dan domain tidak boleh nihil.

  • Code - Kode kesalahan untuk kesalahan tersebut.

  • User Info - Kamus userInfo untuk kesalahan dan userInfo mungkin nihil.

Contoh berikut menunjukkan cara membuat kesalahan khusus

NSString *domain = @"com.MyCompany.MyApplication.ErrorDomain";
NSString *desc = NSLocalizedString(@"Unable to complete the process", @"");
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc };
NSError *error = [NSError errorWithDomain:domain code:-101 userInfo:userInfo];

Berikut adalah kode lengkap dari contoh kesalahan di atas yang diteruskan sebagai referensi ke pointer -

#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
-(NSString *) getEmployeeNameForID:(int) id withError:(NSError **)errorPtr;
@end

@implementation SampleClass

-(NSString *) getEmployeeNameForID:(int) id withError:(NSError **)errorPtr {
   if(id == 1) {
      return @"Employee Test Name";
   } else {
      NSString *domain = @"com.MyCompany.MyApplication.ErrorDomain";
      NSString *desc =@"Unable to complete the process";
      NSDictionary *userInfo = [[NSDictionary alloc] 
      initWithObjectsAndKeys:desc,
      @"NSLocalizedDescriptionKey",NULL];  
      *errorPtr = [NSError errorWithDomain:domain code:-101 
      userInfo:userInfo];
      return @"";
   }
}

@end

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   SampleClass *sampleClass = [[SampleClass alloc]init];
   NSError *error = nil;
   NSString *name1 = [sampleClass getEmployeeNameForID:1 withError:&error];
  
   if(error) {
      NSLog(@"Error finding Name1: %@",error);
   } else {
      NSLog(@"Name1: %@",name1);
   }
   
   error = nil;
   NSString *name2 = [sampleClass getEmployeeNameForID:2 withError:&error];

   if(error) {
      NSLog(@"Error finding Name2: %@",error);
   } else {
      NSLog(@"Name2: %@",name2);
   }

   [pool drain];
   return 0; 
}

Dalam contoh di atas, kami mengembalikan nama jika id-nya adalah 1, jika tidak, kami menyetel objek kesalahan yang ditentukan pengguna.

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-14 18:01:00.809 demo[27632] Name1: Employee Test Name
2013-09-14 18:01:00.809 demo[27632] Error finding Name2: Unable to complete the process

Dimungkinkan untuk meneruskan beberapa nilai dari baris perintah ke program Objective-C Anda saat dijalankan. Nilai-nilai ini disebutcommand line arguments dan sering kali mereka penting untuk program Anda, terutama ketika Anda ingin mengontrol program Anda dari luar alih-alih mengkodekan langsung nilai-nilai itu di dalam kode.

Argumen baris perintah ditangani menggunakan argumen fungsi main () di mana argc mengacu pada jumlah argumen yang diteruskan, dan argv[]adalah array pointer, yang menunjuk ke setiap argumen yang diteruskan ke program. Berikut adalah contoh sederhana, yang memeriksa apakah ada argumen yang disediakan dari baris perintah dan mengambil tindakan yang sesuai -

#import <Foundation/Foundation.h>

int main( int argc, char *argv[] ) {
   if( argc == 2 ) {
      NSLog(@"The argument supplied is %s\n", argv[1]);
   } else if( argc > 2 ) {
      NSLog(@"Too many arguments supplied.\n");
   } else {
      NSLog(@"One argument expected.\n");
   }
}

Ketika kode di atas dikompilasi dan dijalankan dengan satu argumen, katakanlah "pengujian", itu menghasilkan hasil sebagai berikut.

2013-09-13 03:01:17.333 demo[7640] The argument supplied is testing

Ketika kode di atas dikompilasi dan dijalankan dengan dua argumen, katakanlah testing1 dan testing2, itu menghasilkan hasil sebagai berikut.

2013-09-13 03:01:18.333 demo[7640] Too many arguments supplied.

Ketika kode di atas dikompilasi dan dijalankan tanpa melewatkan argumen apa pun, itu menghasilkan hasil sebagai berikut.

2013-09-13 03:01:18.333 demo[7640] One argument expected

Perlu dicatat itu argv[0] memegang nama program itu sendiri dan argv[1]adalah penunjuk ke argumen baris perintah pertama yang diberikan, dan * argv [n] adalah argumen terakhir. Jika tidak ada argumen yang diberikan, argc akan menjadi satu, sebaliknya jika Anda memberikan satu argumen, makaargc disetel ke 2.

Anda meneruskan semua argumen baris perintah yang dipisahkan oleh spasi, tetapi jika argumen itu sendiri memiliki spasi, maka Anda dapat meneruskan argumen tersebut dengan meletakkannya di dalam tanda kutip ganda "" atau tanda kutip tunggal ''. Mari kita tulis ulang contoh di atas sekali lagi di mana kita akan mencetak nama program dan kita juga memberikan argumen baris perintah dengan meletakkan di dalam tanda kutip ganda -

#import <Foundation/Foundation.h>

int main( int argc, char *argv[] ) {
   NSLog(@"Program name %s\n", argv[0]);
 
   if( argc == 2 ) {
      NSLog(@"The argument supplied is %s\n", argv[1]);
   } else if( argc > 2 ) {
      NSLog(@"Too many arguments supplied.\n");
   } else {
      NSLog(@"One argument expected.\n");
   }
   
   return 0;
}

Ketika kode di atas dikompilasi dan dieksekusi dengan argumen tunggal yang dipisahkan oleh spasi tetapi di dalam tanda kutip ganda tertulis "Testing1 Testing2", itu menghasilkan hasil sebagai berikut.

2017-11-30 06:36:59.081 main[71010] Program name main
2017-11-30 06:36:59.082 main[71010] One argument expected.

Tujuan utama dari bahasa pemrograman Objective-C adalah untuk menambahkan orientasi objek ke bahasa pemrograman C dan kelas-kelas adalah fitur utama dari Objective-C yang mendukung pemrograman berorientasi objek dan sering disebut tipe yang ditentukan pengguna.

Kelas digunakan untuk menentukan bentuk objek dan menggabungkan representasi data dan metode untuk memanipulasi data ke dalam satu paket yang rapi. Data dan metode di dalam kelas disebut anggota kelas.

Karakteristik Objective-C

  • Kelas didefinisikan dalam dua bagian berbeda yaitu @interface dan @implementation.

  • Hampir semuanya berbentuk benda.

  • Objek menerima pesan dan objek sering disebut sebagai penerima.

  • Objek berisi variabel instan.

  • Objek dan variabel instance memiliki ruang lingkup.

  • Kelas menyembunyikan implementasi objek.

  • Properti digunakan untuk memberikan akses ke variabel instance kelas di kelas lain.

Definisi Kelas Objective-C

Saat Anda menentukan kelas, Anda menentukan cetak biru untuk tipe data. Ini tidak benar-benar mendefinisikan data apa pun, tetapi itu menentukan apa arti nama kelas, yaitu, apa objek kelas akan terdiri dan operasi apa yang dapat dilakukan pada objek semacam itu.

Definisi kelas dimulai dengan kata kunci @interfacediikuti dengan nama antarmuka (kelas); dan badan kelas, diapit oleh sepasang kurung kurawal. Dalam Objective-C, semua kelas diturunkan dari kelas dasar yang disebutNSObject. Ini adalah superclass dari semua kelas Objective-C. Ini menyediakan metode dasar seperti alokasi memori dan inisialisasi. Misalnya, kami mendefinisikan tipe data Kotak menggunakan kata kunciclass sebagai berikut -

@interface Box:NSObject {
   //Instance variables
   double length;    // Length of a box
   double breadth;   // Breadth of a box
}
@property(nonatomic, readwrite) double height;  // Property

@end

Variabel instance bersifat pribadi dan hanya dapat diakses di dalam implementasi kelas.

Mengalokasikan dan menginisialisasi Objek Objective-C

Sebuah kelas menyediakan cetak biru untuk objek, jadi pada dasarnya sebuah objek dibuat dari sebuah kelas. Kami mendeklarasikan objek kelas dengan jenis deklarasi yang persis sama dengan yang kami deklarasikan variabel tipe dasar. Pernyataan berikut mendeklarasikan dua objek kelas Box -

Box box1 = [[Box alloc]init];     // Create box1 object of type Box
Box box2 = [[Box alloc]init];     // Create box2 object of type Box

Kedua objek box1 dan box2 akan memiliki salinan anggota data mereka sendiri.

Mengakses Anggota Data

Properti objek kelas dapat diakses menggunakan operator akses anggota langsung (.). Mari kita coba contoh berikut untuk memperjelas -

#import <Foundation/Foundation.h>

@interface Box:NSObject {
   double length;    // Length of a box
   double breadth;   // Breadth of a box
   double height;    // Height of a box
}

@property(nonatomic, readwrite) double height;  // Property
-(double) volume;
@end

@implementation Box

@synthesize height; 

-(id)init {
   self = [super init];
   length = 1.0;
   breadth = 1.0;
   return self;
}

-(double) volume {
   return length*breadth*height;
}

@end

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    
   Box *box1 = [[Box alloc]init];    // Create box1 object of type Box
   Box *box2 = [[Box alloc]init];    // Create box2 object of type Box

   double volume = 0.0;             // Store the volume of a box here
 
   // box 1 specification
   box1.height = 5.0; 

   // box 2 specification
   box2.height = 10.0;
  
   // volume of box 1
   volume = [box1 volume];
   NSLog(@"Volume of Box1 : %f", volume);
   
   // volume of box 2
   volume = [box2 volume];
   NSLog(@"Volume of Box2 : %f", volume);
   
   [pool drain];
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-22 21:25:33.314 ClassAndObjects[387:303] Volume of Box1 : 5.000000
2013-09-22 21:25:33.316 ClassAndObjects[387:303] Volume of Box2 : 10.000000

Properti

Properti diperkenalkan di Objective-C untuk memastikan bahwa variabel instance kelas dapat diakses di luar kelas.

  • Properti dimulai dengan @property, yang merupakan kata kunci

  • Ini diikuti dengan penentu akses, yang nonatomik atau atomik, baca-tulis atau hanya-baca dan kuat, unsafe_unretained atau weak. Ini bervariasi berdasarkan jenis variabel. Untuk semua tipe pointer, kita bisa menggunakan strong, unsafe_unretained atau weak. Begitu pula untuk jenis lainnya kita bisa menggunakan readwrite atau readonly.

  • Ini diikuti oleh tipe data variabel.

  • Akhirnya, kami memiliki nama properti yang diakhiri dengan titik koma.

  • Kita dapat menambahkan pernyataan sintesis di kelas implementasi. Tetapi di Xcode terbaru, bagian sintesis diurus oleh XCode dan Anda tidak perlu menyertakan pernyataan sintesis.

Ini hanya mungkin dengan properti kita dapat mengakses variabel instan kelas. Sebenarnya, metode pengambil dan penyetel secara internal dibuat untuk properti.

Misalnya, anggap saja kita memiliki properti @property (nonatomic ,readonly ) BOOL isDone. Di bawah tenda, ada setter dan getter yang dibuat seperti yang ditunjukkan di bawah ini.

-(void)setIsDone(BOOL)isDone;
-(BOOL)isDone;

Salah satu konsep terpenting dalam pemrograman berorientasi objek adalah tentang pewarisan. Inheritance memungkinkan kita untuk mendefinisikan kelas dalam istilah kelas lain yang membuatnya lebih mudah untuk membuat dan memelihara aplikasi. Ini juga memberikan kesempatan untuk menggunakan kembali fungsionalitas kode dan waktu implementasi yang cepat.

Saat membuat kelas, daripada menulis anggota data dan fungsi anggota yang benar-benar baru, pemrogram dapat menetapkan bahwa kelas baru harus mewarisi anggota kelas yang sudah ada. Kelas yang ada ini disebutbase kelas, dan kelas baru disebut sebagai derived kelas.

Gagasan tentang pewarisan mengimplementasikan is ahubungan. Misalnya mamalia IS-A binatang, anjing IS-A mamalia, maka anjing IS-A binatang juga dan sebagainya.

Kelas Dasar & Turunan

Objective-C hanya mengizinkan pewarisan bertingkat, yaitu, ia hanya dapat memiliki satu kelas dasar tetapi mengizinkan pewarisan bertingkat. Semua kelas di Objective-C diturunkan dari superclassNSObject.

@interface derived-class: base-class

Pertimbangkan kelas dasar Person dan kelas turunannya Employee sebagai berikut -

#import <Foundation/Foundation.h>
 
@interface Person : NSObject {
   NSString *personName;
   NSInteger personAge;
}

- (id)initWithName:(NSString *)name andAge:(NSInteger)age;
- (void)print;

@end

@implementation Person

- (id)initWithName:(NSString *)name andAge:(NSInteger)age {
   personName = name;
   personAge = age;
   return self;
}

- (void)print {
   NSLog(@"Name: %@", personName);
   NSLog(@"Age: %ld", personAge);
}

@end

@interface Employee : Person {
   NSString *employeeEducation;
}

- (id)initWithName:(NSString *)name andAge:(NSInteger)age 
  andEducation:(NSString *)education;
- (void)print;
@end

@implementation Employee

- (id)initWithName:(NSString *)name andAge:(NSInteger)age 
   andEducation: (NSString *)education {
      personName = name;
      personAge = age;
      employeeEducation = education;
      return self;
   }

- (void)print {
   NSLog(@"Name: %@", personName);
   NSLog(@"Age: %ld", personAge);
   NSLog(@"Education: %@", employeeEducation);
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];        
   NSLog(@"Base class Person Object");
   Person *person = [[Person alloc]initWithName:@"Raj" andAge:5];
   [person print];
   NSLog(@"Inherited Class Employee Object");
   Employee *employee = [[Employee alloc]initWithName:@"Raj" 
   andAge:5 andEducation:@"MBA"];
   [employee print];        
   [pool drain];
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-22 21:20:09.842 Inheritance[349:303] Base class Person Object
2013-09-22 21:20:09.844 Inheritance[349:303] Name: Raj
2013-09-22 21:20:09.844 Inheritance[349:303] Age: 5
2013-09-22 21:20:09.845 Inheritance[349:303] Inherited Class Employee Object
2013-09-22 21:20:09.845 Inheritance[349:303] Name: Raj
2013-09-22 21:20:09.846 Inheritance[349:303] Age: 5
2013-09-22 21:20:09.846 Inheritance[349:303] Education: MBA

Kontrol Akses dan Warisan

Kelas turunan dapat mengakses semua anggota privat dari kelas dasarnya jika kelas tersebut ditentukan di kelas antarmuka, tetapi kelas tersebut tidak dapat mengakses anggota privat yang ditentukan dalam file implementasi.

Kami dapat meringkas berbagai jenis akses menurut siapa yang dapat mengaksesnya dengan cara berikut -

Kelas turunan mewarisi semua metode dan variabel kelas dasar dengan pengecualian berikut -

  • Variabel yang dideklarasikan dalam file implementasi dengan bantuan ekstensi tidak dapat diakses.

  • Metode yang dideklarasikan dalam file implementasi dengan bantuan ekstensi tidak dapat diakses.

  • Jika kelas yang diwariskan mengimplementasikan metode di kelas dasar, maka metode di kelas turunan akan dijalankan.

Kata polymorphismartinya memiliki banyak bentuk. Biasanya, polimorfisme terjadi ketika ada hierarki kelas dan terkait dengan pewarisan.

Polimorfisme Objective-C berarti bahwa panggilan ke fungsi anggota akan menyebabkan fungsi yang berbeda dijalankan tergantung pada jenis objek yang memanggil fungsi tersebut.

Perhatikan contohnya, kita memiliki kelas Shape yang menyediakan antarmuka dasar untuk semua bentuk. Square dan Rectangle diturunkan dari bentuk kelas dasar.

Kami memiliki metode printArea yang akan ditampilkan tentang fitur OOP polymorphism.

#import <Foundation/Foundation.h>

@interface Shape : NSObject {
   CGFloat area;
}

- (void)printArea;
- (void)calculateArea;
@end

@implementation Shape
- (void)printArea {
   NSLog(@"The area is %f", area);
}

- (void)calculateArea {

}

@end

@interface Square : Shape {
   CGFloat length;
}

- (id)initWithSide:(CGFloat)side;
- (void)calculateArea;

@end

@implementation Square
- (id)initWithSide:(CGFloat)side {
   length = side;
   return self;
}

- (void)calculateArea {
   area = length * length;
}

- (void)printArea {
   NSLog(@"The area of square is %f", area);
}

@end

@interface Rectangle : Shape {
   CGFloat length;
   CGFloat breadth;
}

- (id)initWithLength:(CGFloat)rLength andBreadth:(CGFloat)rBreadth;
@end

@implementation Rectangle
- (id)initWithLength:(CGFloat)rLength andBreadth:(CGFloat)rBreadth {
   length = rLength;
   breadth = rBreadth;
   return self;
}

- (void)calculateArea {
   area = length * breadth;
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   Shape *square = [[Square alloc]initWithSide:10.0];
   [square calculateArea];
   [square printArea];
   Shape *rect = [[Rectangle alloc]
   initWithLength:10.0 andBreadth:5.0];
   [rect calculateArea];
   [rect printArea];        
   [pool drain];
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-22 21:21:50.785 Polymorphism[358:303] The area of square is 100.000000
2013-09-22 21:21:50.786 Polymorphism[358:303] The area is 50.000000

Pada contoh di atas berdasarkan ketersediaan metode hitungArea dan printArea, baik metode di kelas dasar atau kelas turunan yang dijalankan.

Polimorfisme menangani peralihan metode antara kelas dasar dan kelas turunan berdasarkan implementasi metode dari dua kelas.

Semua program Objective-C terdiri dari dua elemen dasar berikut -

  • Program statements (code) - Ini adalah bagian dari program yang melakukan tindakan dan mereka disebut metode.

  • Program data - Data adalah informasi program yang dipengaruhi oleh fungsi program.

Enkapsulasi adalah konsep Pemrograman Berorientasi Objek yang menyatukan data dan fungsi yang memanipulasi data dan yang menjaga keamanan dari gangguan dan penyalahgunaan luar. Enkapsulasi data mengarah pada konsep OOP yang pentingdata hiding.

Data encapsulation merupakan mekanisme bundling data dan fungsi yang menggunakannya, dan data abstraction adalah mekanisme yang hanya memperlihatkan antarmuka dan menyembunyikan detail implementasi dari pengguna.

Objective-C mendukung properti enkapsulasi dan data yang bersembunyi melalui pembuatan tipe yang ditentukan pengguna, yang disebut classes. Misalnya -

@interface Adder : NSObject {
   NSInteger total;
}

- (id)initWithInitialNumber:(NSInteger)initialNumber;
- (void)addNumber:(NSInteger)newNumber;
- (NSInteger)getTotal;

@end

Variabel total bersifat pribadi dan kami tidak dapat mengakses dari luar kelas. Ini berarti bahwa mereka hanya dapat diakses oleh anggota kelas Adder lainnya dan bukan oleh bagian lain dari program Anda. Ini adalah salah satu cara enkapsulasi dicapai.

Metode di dalam file antarmuka dapat diakses dan dalam lingkup publik.

Ada metode pribadi, yang ditulis dengan bantuan extensions, yang akan kita pelajari di bab selanjutnya.

Contoh Enkapsulasi Data

Setiap program Objective-C tempat Anda mengimplementasikan kelas dengan variabel anggota publik dan pribadi adalah contoh enkapsulasi data dan abstraksi data. Perhatikan contoh berikut -

#import <Foundation/Foundation.h>

@interface Adder : NSObject {
   NSInteger total;
}

- (id)initWithInitialNumber:(NSInteger)initialNumber;
- (void)addNumber:(NSInteger)newNumber;
- (NSInteger)getTotal;

@end

@implementation Adder
-(id)initWithInitialNumber:(NSInteger)initialNumber {
   total = initialNumber;
   return self;
}

- (void)addNumber:(NSInteger)newNumber {
   total = total + newNumber;
}

- (NSInteger)getTotal {
   return total;
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];        
   Adder *adder = [[Adder alloc]initWithInitialNumber:10];
   [adder addNumber:5];
   [adder addNumber:4];
   
   NSLog(@"The total is %ld",[adder getTotal]);
   [pool drain];
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

2013-09-22 21:17:30.485 DataEncapsulation[317:303] The total is 19

Kelas di atas menambahkan angka bersama dan mengembalikan jumlahnya. Anggota publikaddNum dan getTotal adalah antarmuka ke dunia luar dan pengguna perlu mengetahuinya untuk menggunakan kelas. Anggota pribaditotal adalah sesuatu yang tersembunyi dari dunia luar, tetapi dibutuhkan agar kelas dapat beroperasi dengan baik.

Strategi Merancang

Sebagian besar dari kita telah belajar melalui pengalaman pahit untuk menjadikan anggota kelas pribadi secara default kecuali kita benar-benar perlu mengekspos mereka. Itu bagusencapsulation.

Penting untuk memahami enkapsulasi data karena ini adalah salah satu fitur inti dari semua bahasa Pemrograman Berorientasi Objek (OOP) termasuk Objective-C.

Terkadang, Anda mungkin ingin memperluas kelas yang ada dengan menambahkan perilaku yang hanya berguna dalam situasi tertentu. Untuk menambahkan ekstensi tersebut ke kelas yang ada, Objective-C menyediakancategories dan extensions.

Jika Anda perlu menambahkan metode ke kelas yang sudah ada, mungkin, untuk menambahkan fungsionalitas agar lebih mudah melakukan sesuatu di aplikasi Anda sendiri, cara termudah adalah dengan menggunakan kategori.

Sintaks untuk mendeklarasikan kategori menggunakan kata kunci @interface, seperti deskripsi kelas Objective-C standar, tetapi tidak menunjukkan pewarisan apa pun dari subclass. Sebaliknya, ini menentukan nama kategori dalam tanda kurung, seperti ini -

@interface ClassName (CategoryName)

@end

Karakteristik kategori

  • Kategori dapat dideklarasikan untuk semua kelas, meskipun Anda tidak memiliki kode sumber implementasi asli.

  • Metode apa pun yang Anda deklarasikan dalam kategori akan tersedia untuk semua instance kelas asli, serta setiap subclass dari kelas asli.

  • Saat runtime, tidak ada perbedaan antara metode yang ditambahkan oleh kategori dan metode yang diterapkan oleh kelas asli.

Sekarang, mari kita lihat contoh penerapan kategori. Mari tambahkan kategori ke kelas Cocoa NSString. Kategori ini memungkinkan kita menambahkan metode baru getCopyRightString yang membantu kita mengembalikan string hak cipta. Itu ditunjukkan di bawah ini.

#import <Foundation/Foundation.h>

@interface NSString(MyAdditions)
+(NSString *)getCopyRightString;
@end

@implementation NSString(MyAdditions)

+(NSString *)getCopyRightString {
   return @"Copyright TutorialsPoint.com 2013";
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   NSString *copyrightString = [NSString getCopyRightString];
   NSLog(@"Accessing Category: %@",copyrightString);
   
   [pool drain];
   return 0;
}

Sekarang ketika kita mengkompilasi dan menjalankan program, kita akan mendapatkan hasil sebagai berikut.

2013-09-22 21:19:12.125 Categories[340:303] Accessing Category: Copyright TutorialsPoint.com 2013

Meskipun metode apa pun yang ditambahkan oleh kategori tersedia untuk semua instance kelas dan subkelasnya, Anda harus mengimpor file header kategori di file kode sumber mana pun di mana Anda ingin menggunakan metode tambahan, jika tidak Anda akan mengalami peringatan dan kesalahan kompilator.

Dalam contoh kami, karena kami hanya memiliki satu kelas, kami belum menyertakan file header apa pun, dalam kasus seperti itu kami harus menyertakan file header seperti yang disebutkan di atas.

Sebelum memulai tentang Berpose di Objective-C, saya ingin memberi tahu Anda bahwa Berpose dinyatakan tidak digunakan lagi di Mac OS X 10.5 dan tidak tersedia untuk digunakan setelahnya. Jadi bagi mereka yang tidak khawatir tentang metode usang ini dapat melewati bab ini.

Objective-C mengizinkan kelas untuk sepenuhnya menggantikan kelas lain dalam sebuah program. Kelas pengganti dikatakan "berpose sebagai" kelas target.

Untuk versi yang mendukung pose, semua pesan yang dikirim ke kelas target akan diterima oleh kelas tersebut.

NSObject berisi metode poseAsClass: yang memungkinkan kita untuk mengganti kelas yang ada seperti yang dikatakan di atas.

Batasan dalam Berpose

  • Kelas A hanya dapat berpura-pura sebagai salah satu kelas super langsung atau tidak langsungnya.

  • Kelas berpose tidak boleh mendefinisikan variabel instan baru yang tidak ada dari kelas target (meskipun itu mungkin mendefinisikan atau mengganti metode).

  • Kelas target mungkin belum menerima pesan apa pun sebelum berpose.

  • Kelas berpose dapat memanggil metode yang diganti melalui super, sehingga menggabungkan implementasi kelas target.

  • Kelas berpose dapat mengganti metode yang ditentukan dalam kategori.

#import <Foundation/Foundation.h>

@interface MyString : NSString

@end

@implementation MyString

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target
withString:(NSString *)replacement {
   NSLog(@"The Target string is %@",target);
   NSLog(@"The Replacement string is %@",replacement);
}

@end

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   [MyString poseAsClass:[NSString class]];
   NSString *string = @"Test";
   [string stringByReplacingOccurrencesOfString:@"a" withString:@"c"];
   
   [pool drain];
   return 0;
}

Sekarang ketika kita mengkompilasi dan menjalankan program di Mac OS X yang lebih lama (V_10.5 atau sebelumnya), kita akan mendapatkan hasil sebagai berikut.

2013-09-22 21:23:46.829 Posing[372:303] The Target string is a
2013-09-22 21:23:46.830 Posing[372:303] The Replacement string is c

Dalam contoh di atas, kami baru saja mencemari metode asli dengan implementasi kami dan ini akan terpengaruh di seluruh operasi NSString dengan metode di atas.

Sebuah ekstensi kelas memiliki beberapa kesamaan dengan kategori, tetapi itu hanya dapat ditambahkan ke kelas yang Anda memiliki kode sumber pada waktu kompilasi (kelas dikompilasi pada waktu yang sama dengan ekstensi kelas).

Metode yang dideklarasikan oleh ekstensi kelas diimplementasikan dalam blok implementasi untuk kelas asli, sehingga Anda tidak dapat, misalnya, mendeklarasikan ekstensi kelas pada kelas framework, seperti kelas Cocoa atau Cocoa Touch seperti NSString.

Ekstensi sebenarnya adalah kategori tanpa nama kategori. Ini sering disebutanonymous categories.

Sintaks untuk mendeklarasikan ekstensi menggunakan kata kunci @interface, seperti deskripsi kelas Objective-C standar, tetapi tidak menunjukkan pewarisan apa pun dari subkelas. Sebagai gantinya, itu hanya menambahkan tanda kurung, seperti yang ditunjukkan di bawah ini -

@interface ClassName ()

@end

Karakteristik ekstensi

  • Sebuah ekstensi tidak dapat dideklarasikan untuk kelas manapun, hanya untuk kelas yang kita memiliki implementasi kode sumber asli.

  • Ekstensi menambahkan metode privat dan variabel privat yang hanya khusus untuk kelas.

  • Metode atau variabel apa pun yang dideklarasikan di dalam ekstensi tidak dapat diakses bahkan oleh kelas yang diwariskan.

Contoh Ekstensi

Mari buat kelas SampleClass yang memiliki ekstensi. Di ekstensi, mari kita memiliki variabel pribadi internalID.

Kemudian, mari kita memiliki metode getExternalID yang mengembalikan externalID setelah memproses internalID.

Contoh ditunjukkan di bawah ini dan ini tidak akan berfungsi pada kompiler online.

#import <Foundation/Foundation.h>

@interface SampleClass : NSObject {
   NSString *name;
}

- (void)setInternalID;
- (NSString *)getExternalID;

@end

@interface SampleClass() {
   NSString *internalID;
}

@end

@implementation SampleClass

- (void)setInternalID {
   internalID = [NSString stringWithFormat: 
   @"UNIQUEINTERNALKEY%dUNIQUEINTERNALKEY",arc4random()%100];
}

- (NSString *)getExternalID {
   return [internalID stringByReplacingOccurrencesOfString: 
   @"UNIQUEINTERNALKEY" withString:@""];
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass setInternalID];
   NSLog(@"ExternalID: %@",[sampleClass getExternalID]);        
   [pool drain];
   return 0;
}

Sekarang ketika kita mengkompilasi dan menjalankan program, kita akan mendapatkan hasil sebagai berikut.

2013-09-22 21:18:31.754 Extensions[331:303] ExternalID: 51

Pada contoh di atas, kita dapat melihat bahwa internalID tidak dikembalikan secara langsung. Di sini kami menghapus UNIQUEINTERNALKEY dan hanya menyediakan nilai yang tersisa untuk metode getExternalID.

Contoh di atas hanya menggunakan operasi string, tetapi dapat memiliki banyak fitur seperti enkripsi / dekripsi dan sebagainya.

Objective-C memungkinkan Anda untuk mendefinisikan protokol, yang menyatakan metode yang diharapkan akan digunakan untuk situasi tertentu. Protokol diimplementasikan di kelas yang sesuai dengan protokol.

Contoh sederhananya adalah kelas penanganan URL jaringan, ia akan memiliki protokol dengan metode seperti metode delegasi processCompleted yang mengintimidasi kelas pemanggil setelah operasi pengambilan URL jaringan selesai.

Sintaks protokol ditampilkan di bawah ini.

@protocol ProtocolName
@required
// list of required methods
@optional
// list of optional methods
@end

Metode di bawah kata kunci @required harus diterapkan di kelas yang sesuai dengan protokol dan metode di bawah @optional kata kunci bersifat opsional untuk diterapkan.

Berikut adalah sintaks untuk kelas yang sesuai dengan protokol

@interface MyClass : NSObject <MyProtocol>
...
@end

Ini berarti bahwa setiap instance MyClass tidak hanya akan merespons metode yang dideklarasikan secara khusus di antarmuka, tetapi MyClass juga menyediakan implementasi untuk metode yang diperlukan di MyProtocol. Tidak perlu mendeklarasikan ulang metode protokol di antarmuka kelas - cukup mengadopsi protokol.

Jika Anda memerlukan kelas untuk mengadopsi beberapa protokol, Anda dapat menetapkannya sebagai daftar yang dipisahkan koma. Kami memiliki objek delegasi yang menyimpan referensi objek pemanggil yang mengimplementasikan protokol.

Contohnya ditunjukkan di bawah ini.

#import <Foundation/Foundation.h>

@protocol PrintProtocolDelegate
- (void)processCompleted;

@end

@interface PrintClass :NSObject {
   id delegate;
}

- (void) printDetails;
- (void) setDelegate:(id)newDelegate;
@end

@implementation PrintClass
- (void)printDetails {
   NSLog(@"Printing Details");
   [delegate processCompleted];
}

- (void) setDelegate:(id)newDelegate {
   delegate = newDelegate;
}

@end

@interface SampleClass:NSObject<PrintProtocolDelegate>
- (void)startAction;

@end

@implementation SampleClass
- (void)startAction {
   PrintClass *printClass = [[PrintClass alloc]init];
   [printClass setDelegate:self];
   [printClass printDetails];
}

-(void)processCompleted {
   NSLog(@"Printing Process Completed");
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass startAction];
   [pool drain];
   return 0;
}

Sekarang ketika kita mengkompilasi dan menjalankan program, kita akan mendapatkan hasil sebagai berikut.

2013-09-22 21:15:50.362 Protocols[275:303] Printing Details
2013-09-22 21:15:50.364 Protocols[275:303] Printing Process Completed

Dalam contoh di atas kita telah melihat bagaimana metode delgate dipanggil dan dijalankan. Ini dimulai dengan startAction, setelah proses selesai, metode delegasi processCompleted dipanggil untuk mendekati operasi selesai.

Di aplikasi iOS atau Mac mana pun, kami tidak akan pernah memiliki program yang diimplementasikan tanpa delegasi. Jadi, penting bagi kami untuk memahami penggunaan delegasi. Objek delegasi harus menggunakan tipe properti unsafe_unretained untuk menghindari kebocoran memori.

Pengikatan dinamis menentukan metode yang akan dipanggil pada waktu proses, bukan pada waktu kompilasi. Pengikatan dinamis juga disebut sebagai pengikatan akhir.

Di Objective-C, semua metode diselesaikan secara dinamis saat runtime. Kode persis yang dieksekusi ditentukan oleh nama metode (selektor) dan objek penerima.

Pengikatan dinamis memungkinkan polimorfisme. Misalnya, pertimbangkan kumpulan objek termasuk Persegi Panjang dan Persegi. Setiap objek memiliki implementasi metode printArea sendiri.

Dalam potongan kode berikut, kode sebenarnya yang harus dijalankan oleh ekspresi [anObject printArea] ditentukan saat runtime. Sistem runtime menggunakan selektor untuk menjalankan metode untuk mengidentifikasi metode yang sesuai di kelas apa pun dari anObject ternyata.

Mari kita lihat kode sederhana yang akan menjelaskan pengikatan dinamis.

#import <Foundation/Foundation.h>

@interface Square:NSObject {
   float area;
}

- (void)calculateAreaOfSide:(CGFloat)side;
- (void)printArea;
@end

@implementation Square
- (void)calculateAreaOfSide:(CGFloat)side {
   area = side * side;
}

- (void)printArea {
   NSLog(@"The area of square is %f",area);
}

@end

@interface Rectangle:NSObject {
   float area;
}

- (void)calculateAreaOfLength:(CGFloat)length andBreadth:(CGFloat)breadth;
- (void)printArea;
@end

@implementation  Rectangle

- (void)calculateAreaOfLength:(CGFloat)length andBreadth:(CGFloat)breadth {
   area = length * breadth;
}

- (void)printArea {
   NSLog(@"The area of Rectangle is %f",area);
}

@end

int main() {
   Square *square = [[Square alloc]init];
   [square calculateAreaOfSide:10.0];
   
   Rectangle *rectangle = [[Rectangle alloc]init];
   [rectangle calculateAreaOfLength:10.0 andBreadth:5.0];
   
   NSArray *shapes = [[NSArray alloc]initWithObjects: square, rectangle,nil];
   id object1 = [shapes objectAtIndex:0];
   [object1 printArea];
   
   id object2 = [shapes objectAtIndex:1];
   [object2 printArea];
   
   return 0;
}

Sekarang ketika kita mengkompilasi dan menjalankan program, kita akan mendapatkan hasil sebagai berikut.

2013-09-28 07:42:29.821 demo[4916] The area of square is 100.000000
2013-09-28 07:42:29.821 demo[4916] The area of Rectangle is 50.000000

Seperti yang Anda lihat pada contoh di atas, metode printArea dipilih secara dinamis saat runtime. Ini adalah contoh untuk pengikatan dinamis dan sangat berguna dalam banyak situasi ketika berhadapan dengan jenis objek yang serupa.

Kita dapat membuat subclass di dalam cluster kelas yang mendefinisikan kelas yang menyematkan objek di dalamnya. Objek kelas ini adalah objek komposit.

Jadi Anda mungkin bertanya-tanya apa itu cluster kelas. Jadi pertama-tama kita akan melihat apa itu cluster kelas.

Kelompok Kelas

Kluster kelas adalah pola desain yang digunakan secara ekstensif oleh framework Foundation. Cluster kelas mengelompokkan sejumlah subclass beton pribadi di bawah superclass abstrak publik. Pengelompokan kelas dengan cara ini menyederhanakan arsitektur yang terlihat secara publik dari kerangka kerja berorientasi objek tanpa mengurangi kekayaan fungsionalnya. Cluster kelas didasarkan pada pola desain Pabrik Abstrak.

Untuk membuatnya sederhana, alih-alih membuat banyak kelas untuk fungsi serupa, kami membuat satu kelas yang akan menangani penanganannya berdasarkan nilai input.

Misalnya, di NSNumber kita memiliki banyak cluster kelas seperti char, int, bool, dan sebagainya. Kami mengelompokkan semuanya ke dalam satu kelas yang menangani penanganan operasi serupa dalam satu kelas. NSNumber sebenarnya membungkus nilai tipe primitif ini menjadi objek.

Jadi apa sebenarnya objek komposit?

Dengan menyematkan objek cluster pribadi di objek desain kami sendiri, kami membuat objek komposit. Objek gabungan ini dapat mengandalkan objek cluster untuk fungsionalitas dasarnya, hanya mencegat pesan yang ingin ditangani oleh objek gabungan dengan cara tertentu. Arsitektur ini mengurangi jumlah kode yang harus kita tulis dan memungkinkan Anda memanfaatkan kode yang diuji yang disediakan oleh Foundation Framework.

Hal tersebut dijelaskan pada gambar berikut.

Objek komposit harus mendeklarasikan dirinya sebagai subkelas dari superclass abstrak cluster. Sebagai subclass, itu harus mengganti metode primitif superclass. Itu juga bisa mengganti metode turunan, tetapi ini tidak perlu karena metode turunan bekerja melalui metode primitif.

Metode hitungan kelas NSArray adalah contohnya; implementasi objek intervensi dari metode yang ditimpanya bisa sesederhana -

- (unsigned)count  {
   return [embeddedObject count];
}

Dalam contoh di atas, objek yang disematkan sebenarnya berjenis NSArray.

Contoh Objek Komposit

Sekarang untuk melihat contoh lengkapnya, mari kita lihat contoh dari dokumentasi Apple yang diberikan di bawah ini.

#import <Foundation/Foundation.h>

@interface ValidatingArray : NSMutableArray {
   NSMutableArray *embeddedArray;
}

+ validatingArray;
- init;
- (unsigned)count;
- objectAtIndex:(unsigned)index;
- (void)addObject:object;
- (void)replaceObjectAtIndex:(unsigned)index withObject:object;
- (void)removeLastObject;
- (void)insertObject:object atIndex:(unsigned)index;
- (void)removeObjectAtIndex:(unsigned)index;

@end

@implementation ValidatingArray
- init {
   self = [super init];
   if (self) {
      embeddedArray = [[NSMutableArray allocWithZone:[self zone]] init];
   }
   return self;
}

+ validatingArray {
   return [[self alloc] init] ;
}

- (unsigned)count {
   return [embeddedArray count];
}

- objectAtIndex:(unsigned)index {
   return [embeddedArray objectAtIndex:index];
}

- (void)addObject:(id)object {
   if (object != nil) {
      [embeddedArray addObject:object];
   }
}

- (void)replaceObjectAtIndex:(unsigned)index withObject:(id)object; {
   if (index <[embeddedArray count] && object != nil) {
      [embeddedArray replaceObjectAtIndex:index withObject:object];
   }
}

- (void)removeLastObject; {
   if ([embeddedArray count] > 0) {
      [embeddedArray removeLastObject];
   }
}

- (void)insertObject:(id)object atIndex:(unsigned)index; {
   if (object != nil) {
      [embeddedArray insertObject:object atIndex:index];
   }
}

- (void)removeObjectAtIndex:(unsigned)index; {
   if (index <[embeddedArray count]) {
      [embeddedArray removeObjectAtIndex:index];
   }
}

@end

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   ValidatingArray *validatingArray = [ValidatingArray validatingArray];
   
   [validatingArray addObject:@"Object1"];
   [validatingArray addObject:@"Object2"];
   [validatingArray addObject:[NSNull null]];
   [validatingArray removeObjectAtIndex:2];
   NSString *aString = [validatingArray objectAtIndex:1];
   NSLog(@"The value at Index 1 is %@",aString);
   [pool drain];
   
   return 0;
}

Sekarang ketika kita mengkompilasi dan menjalankan program, kita akan mendapatkan hasil sebagai berikut.

2013-09-28 22:03:54.294 demo[6247] The value at Index 1 is Object2

Dalam contoh di atas, kita dapat melihat bahwa memvalidasi satu fungsi array tidak akan memungkinkan penambahan objek null yang akan menyebabkan crash dalam skenario normal. Tetapi array validasi kami menanganinya. Demikian pula, masing-masing metode dalam memvalidasi array menambahkan proses validasi selain dari urutan operasi normal.

Jika Anda merujuk dokumentasi Apple, Anda dapat melihat detail kerangka Foundation seperti yang diberikan di bawah ini.

Framework Foundation mendefinisikan lapisan dasar kelas Objective-C. Selain menyediakan satu set kelas objek primitif yang berguna, ia memperkenalkan beberapa paradigma yang mendefinisikan fungsionalitas yang tidak tercakup oleh bahasa Objective-C. Kerangka Foundation dirancang dengan tujuan berikut -

  • Sediakan satu set kecil kelas utilitas dasar.

  • Jadikan pengembangan perangkat lunak lebih mudah dengan memperkenalkan konvensi yang konsisten untuk hal-hal seperti deallocation.

  • Mendukung string Unicode, persistensi objek, dan distribusi objek.

  • Memberikan tingkat kemandirian OS untuk meningkatkan portabilitas.

Kerangka kerja ini dikembangkan oleh NeXTStep, yang diakuisisi oleh Apple dan kelas dasar ini menjadi bagian dari Mac OS X dan iOS.

Sejak dikembangkan oleh NeXTStep, ia memiliki awalan kelas "NS".

Kami telah menggunakan Framework Foundation di semua program sampel kami. Hampir suatu keharusan untuk menggunakan Foundation Framework.

Umumnya, kami menggunakan sesuatu seperti #import <Foundation/NSString.h> untuk mengimpor kelas Objective-C, tetapi untuk menghindari impor terlalu banyak kelas, semuanya diimpor #import <Foundation/Foundation.h>.

NSObject adalah kelas dasar dari semua objek termasuk kelas kit pondasi. Ini menyediakan metode untuk manajemen memori. Ini juga menyediakan antarmuka dasar ke sistem runtime dan kemampuan untuk berperilaku sebagai objek Objective-C. Itu tidak memiliki kelas dasar dan merupakan akar untuk semua kelas.

Kelas Foundation berdasarkan fungsionalitas

Sr.No. Jenis & Deskripsi Loop
1 Penyimpanan data

NSArray, NSDictionary, dan NSSet menyediakan penyimpanan untuk objek Objective-C dari semua kelas.

2 Teks dan string

NSCharacterSet mewakili berbagai pengelompokan karakter yang digunakan oleh kelas NSString dan NSScanner. Kelas NSString mewakili string teks dan menyediakan metode untuk mencari, menggabungkan, dan membandingkan string. Objek NSScanner digunakan untuk memindai angka dan kata dari objek NSString.

3 Tanggal dan waktu

Kelas NSDate, NSTimeZone, dan NSCalendar menyimpan waktu dan tanggal serta mewakili informasi kalender. Mereka menawarkan metode untuk menghitung perbedaan tanggal dan waktu. Bersama dengan NSLocale, mereka menyediakan metode untuk menampilkan tanggal dan waktu dalam banyak format dan untuk menyesuaikan waktu dan tanggal berdasarkan lokasi di dunia.

4 Penanganan pengecualian

Penanganan pengecualian digunakan untuk menangani situasi yang tidak terduga dan ditawarkan di Objective-C dengan NSException.

5 Penanganan file

Penanganan file dilakukan dengan bantuan class NSFileManager.

6 Sistem pemuatan URL

Sekumpulan kelas dan protokol yang menyediakan akses ke protokol Internet umum.

Pencacahan cepat adalah fitur Objective-C yang membantu dalam pencacahan melalui koleksi. Maka untuk mengetahui tentang pencacahan cepat, kita perlu mengetahui tentang pengumpulan terlebih dahulu yang akan dijelaskan pada bagian berikut.

Koleksi di Objective-C

Koleksi adalah konstruksi fundamental. Ini digunakan untuk memegang dan mengatur objek lain. Keseluruhan tujuan koleksi adalah menyediakan cara umum untuk menyimpan dan mengambil objek secara efisien.

Ada beberapa jenis koleksi. Sementara mereka semua memenuhi tujuan yang sama untuk dapat menahan objek lain, mereka berbeda sebagian besar dalam cara pengambilan objek. Koleksi paling umum yang digunakan di Objective-C adalah -

  • NSSet
  • NSArray
  • NSDictionary
  • NSMutableSet
  • NSMutableArray
  • NSMutableDictionary

Jika Anda ingin tahu lebih banyak tentang struktur ini, silakan lihat penyimpanan data di Foundation Framework .

Sintaks pencacahan cepat

for (classType variable in collectionObject ) { 
  statements 
}

Berikut adalah contoh pencacahan cepat.

#import <Foundation/Foundation.h>

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   NSArray *array = [[NSArray alloc]
   initWithObjects:@"string1", @"string2",@"string3",nil];
   
   for(NSString *aString in array) {
      NSLog(@"Value: %@",aString);
   }
   
   [pool drain];
   return 0;
}

Sekarang ketika kita mengkompilasi dan menjalankan program, kita akan mendapatkan hasil sebagai berikut.

2013-09-28 06:26:22.835 demo[7426] Value: string1
2013-09-28 06:26:22.836 demo[7426] Value: string2
2013-09-28 06:26:22.836 demo[7426] Value: string3

Seperti yang Anda lihat di keluaran, masing-masing objek dalam larik dicetak secara berurutan.

Pencacahan Cepat Mundur

for (classType variable in [collectionObject reverseObjectEnumerator] ) { 
  statements 
}

Berikut adalah contoh untuk reverseObjectEnumerator dalam pencacahan cepat.

#import <Foundation/Foundation.h>

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   NSArray *array = [[NSArray alloc]
   initWithObjects:@"string1", @"string2",@"string3",nil];
   
   for(NSString *aString in [array reverseObjectEnumerator]) {
      NSLog(@"Value: %@",aString);
   }
   
   [pool drain];
   return 0;
}

Sekarang ketika kita mengkompilasi dan menjalankan program, kita akan mendapatkan hasil sebagai berikut.

2013-09-28 06:27:51.025 demo[12742] Value: string3
2013-09-28 06:27:51.025 demo[12742] Value: string2
2013-09-28 06:27:51.025 demo[12742] Value: string1

Seperti yang Anda lihat di output, masing-masing objek dalam array dicetak tetapi dalam urutan terbalik dibandingkan dengan pencacahan cepat normal.

Manajemen memori adalah salah satu proses terpenting dalam bahasa pemrograman apa pun. Ini adalah proses di mana memori objek dialokasikan saat dibutuhkan dan dialokasikan saat tidak lagi diperlukan.

Mengelola memori objek adalah masalah kinerja; jika aplikasi tidak membebaskan objek yang tidak dibutuhkan, jejak memorinya akan bertambah dan kinerjanya akan menurun.

Teknik manajemen memori Objective-C secara luas dapat diklasifikasikan menjadi dua jenis.

  • "Manual Retain-Release" atau MRR
  • "Penghitungan Referensi Otomatis" atau ARC

"Manual Retain-Release" atau MRR

Di MRR, kami secara eksplisit mengelola memori dengan melacak objek sendiri. Ini diimplementasikan menggunakan model, yang dikenal sebagai penghitungan referensi, yang disediakan NSObject kelas Foundation dalam hubungannya dengan lingkungan runtime.

Satu-satunya perbedaan antara MRR dan ARC adalah bahwa retensi dan pelepasan ditangani oleh kami secara manual di versi sebelumnya sementara yang terakhir ditangani secara otomatis.

Gambar berikut mewakili contoh cara kerja manajemen memori di Objective-C.

Siklus hidup memori dari objek Kelas A ditunjukkan pada gambar di atas. Seperti yang Anda lihat, jumlah retensi ditampilkan di bawah objek, ketika jumlah retensi suatu objek menjadi 0, objek dibebaskan sepenuhnya dan memorinya dibatalkan alokasinya untuk digunakan objek lain.

Objek Kelas A pertama kali dibuat menggunakan metode alokasi / init yang tersedia di NSObject. Sekarang, jumlah retensi menjadi 1.

Sekarang, kelas B mempertahankan Objek Kelas A dan jumlah penahan objek Kelas A menjadi 2.

Kemudian, Kelas C membuat salinan objek tersebut. Sekarang, itu dibuat sebagai instance lain dari Kelas A dengan nilai yang sama untuk variabel instance. Di sini, jumlah retensi adalah 1 dan bukan hitungan retensi dari benda aslinya. Ini diwakili oleh garis putus-putus pada gambar.

Objek yang disalin dilepaskan oleh Kelas C menggunakan metode rilis dan jumlah retensi menjadi 0 dan karenanya objek dimusnahkan.

Dalam kasus Objek Kelas A awal, jumlah retensi adalah 2 dan harus dilepaskan dua kali agar bisa dihancurkan. Hal ini dilakukan dengan pernyataan rilis Kelas A dan Kelas B yang masing-masing mengurangi jumlah retensi ke 1 dan 0. Akhirnya, objek tersebut dihancurkan.

Aturan Dasar MRR

  • Kami memiliki objek apa pun yang kami buat: Kami membuat objek menggunakan metode yang namanya dimulai dengan "alokasi", "baru", "salin", atau "mutableCopy"

  • Kita dapat mengambil kepemilikan suatu objek menggunakan retensi: Objek yang diterima biasanya dijamin tetap valid dalam metode penerimaannya, dan metode itu juga dapat mengembalikan objek ke invokernya dengan aman. Kami menggunakan retensi dalam dua situasi -

    • Dalam implementasi metode pengakses atau metode init, untuk mengambil kepemilikan objek yang ingin kita simpan sebagai nilai properti.

    • Untuk mencegah objek menjadi tidak valid sebagai efek samping dari beberapa operasi lainnya.

  • Saat kita tidak lagi membutuhkannya, kita harus melepaskan kepemilikan atas objek yang kita miliki: Kita melepaskan kepemilikan suatu objek dengan mengirimkannya pesan rilis atau pesan autorelease. Dalam terminologi Cocoa, melepaskan kepemilikan suatu objek oleh karena itu biasanya disebut sebagai "melepaskan" suatu objek.

  • Anda tidak boleh melepaskan kepemilikan objek yang bukan milik Anda: Ini hanya akibat wajar dari aturan kebijakan sebelumnya yang dinyatakan secara eksplisit.

#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
- (void)sampleMethod;
@end

@implementation SampleClass
- (void)sampleMethod {
   NSLog(@"Hello, World! \n");
}

- (void)dealloc  {
  NSLog(@"Object deallocated");
  [super dealloc];
}

@end

int main() {
   
   /* my first program in Objective-C */
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass sampleMethod];
   
   NSLog(@"Retain Count after initial allocation: %d", 
   [sampleClass retainCount]);
   [sampleClass retain];
   
   NSLog(@"Retain Count after retain: %d", [sampleClass retainCount]);
   [sampleClass release];
   NSLog(@"Retain Count after release: %d", [sampleClass retainCount]);
   [sampleClass release];
   NSLog(@"SampleClass dealloc will be called before this");
   
   // Should set the object to nil
   sampleClass = nil;
   return 0;
}

Saat kita mengkompilasi program di atas, kita akan mendapatkan keluaran sebagai berikut.

2013-09-28 04:39:52.310 demo[8385] Hello, World!
2013-09-28 04:39:52.311 demo[8385] Retain Count after initial allocation: 1
2013-09-28 04:39:52.311 demo[8385] Retain Count after retain: 2
2013-09-28 04:39:52.311 demo[8385] Retain Count after release: 1
2013-09-28 04:39:52.311 demo[8385] Object deallocated
2013-09-28 04:39:52.311 demo[8385] SampleClass dealloc will be called before this

"Penghitungan Referensi Otomatis" atau ARC

Dalam Penghitungan Referensi Otomatis atau ARC, sistem menggunakan sistem penghitungan referensi yang sama seperti MRR, tetapi menyisipkan panggilan metode manajemen memori yang sesuai untuk kita pada waktu kompilasi. Kami sangat dianjurkan untuk menggunakan ARC untuk proyek baru. Jika kami menggunakan ARC, biasanya tidak perlu memahami implementasi yang mendasari yang dijelaskan dalam dokumen ini, meskipun mungkin dalam beberapa situasi dapat membantu. Untuk selengkapnya tentang ARC, lihat Transisi ke Catatan Rilis ARC.

Seperti disebutkan di atas, di ARC, kita tidak perlu menambahkan metode rilis dan penyimpanan karena itu akan ditangani oleh kompilator. Sebenarnya, proses yang mendasari Objective-C masih sama. Ini menggunakan operasi pertahankan dan lepaskan secara internal sehingga memudahkan pengembang untuk membuat kode tanpa mengkhawatirkan operasi ini, yang akan mengurangi jumlah kode yang ditulis dan kemungkinan kebocoran memori.

Ada prinsip lain yang disebut pengumpulan sampah, yang digunakan di Mac OS-X bersama dengan MRR, tetapi karena tidak digunakan lagi di OS-X Mountain Lion, hal itu belum dibahas bersama MRR. Selain itu, objek iOS tidak pernah memiliki fitur pengumpulan sampah. Dan dengan ARC, tidak ada penggunaan pengumpulan sampah di OS-X juga.

Berikut adalah contoh ARC sederhana. Perhatikan bahwa ini tidak akan berfungsi pada kompiler online karena tidak mendukung ARC.

#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
- (void)sampleMethod;
@end

@implementation SampleClass
- (void)sampleMethod {
   NSLog(@"Hello, World! \n");
}

- (void)dealloc  {
  NSLog(@"Object deallocated");
}

@end

int main() {
   /* my first program in Objective-C */
   @autoreleasepool {
      SampleClass *sampleClass = [[SampleClass alloc]init];
      [sampleClass sampleMethod];
      sampleClass = nil;
   }
   return 0;
}

Saat kita mengkompilasi program di atas, kita akan mendapatkan keluaran sebagai berikut.

2013-09-28 04:45:47.310 demo[8385] Hello, World!
2013-09-28 04:45:47.311 demo[8385] Object deallocated