Di Objective C Anda memiliki konsep mengirim pesan ke objek lain, dan, well ini sangat mirip dengan metode pemanggilan dalam bahasa seperti C # dan Java.
Tetapi apa sebenarnya perbedaan yang halus itu? Bagaimana saya harus memikirkan pengiriman pesan ketika memikirkan kode saya?
Catatan: Hanya sedikit latar belakang di sini, saya adalah pengembang C # / Java yang mencoba memahami beberapa konsep tentang Objective C.
Jawaban:
Pesan adalah nama pemilih, dan parameter untuk pemilih itu.
Selektor adalah simbol.
Metode adalah sepotong kode dalam kelas yang diidentifikasi oleh pemilih.
Dengan kata lain,
[foo bar: baz]
katakan "kirim pesan yang disebut@selector(bar:)
dengan parameterbaz
ke objekfoo
. Anda bisa mengirim pesan itu ke banyak objek berbeda.Sebaliknya, metode
bar:
untukFoo
mungkin terlihat sepertitapi untuk yang
FooTwo
mungkin terlihat seperti(Saya harap saya memiliki hak sintaksis; sudah lama sejak saya terakhir menyentuh Objective-C.)
Ketika Anda mengirim pesan, kernel Objective-C mengirimkan pesan
foo
yang memutuskan apakah ia memahami pesan tersebut. Ia memutuskan ini berdasarkan apakah ia dapat menemukan metode yang diidentifikasi oleh pemilih itu.Dua metode dengan nama yang sama, dan satu pesan.
Mungkin juga untuk objek hanya meneruskan pesan tertentu (atau serangkaian pesan) ke objek lain untuk diproses. Dalam hal ini, Anda mengirim pesan ke objek proxy ini, yang tidak memiliki metode untuk mencocokkan pesan itu , dan proxy meneruskan pesan ke objek yang dibungkus.
sumber
Dari sudut pandang teori semata, tidak ada perbedaan di antara keduanya - ada sejumlah bukti formal yang menunjukkan bahwa keduanya sama-sama setara, dan keduanya dapat diimplementasikan sepenuhnya dalam hal yang lain.
Dari sudut pandang yang sedikit kurang teoretis, ada satu perbedaan yang mungkin: dalam implementasi tipikal, tabel fungsi virtual dialokasikan secara statis dan konten setiap vtable diperbaiki pada waktu kompilasi. Sebaliknya, pencarian pesan biasanya dilakukan dengan semacam objek peta, yang biasanya dinamis, artinya Anda dapat memodifikasinya saat runtime. Ini membuatnya relatif mudah untuk menambahkan respons baru ke pesan di kelas yang ada. Sayangnya, dalam kebanyakan kasus ini sebagian besar tetap teoretis. Pertama, pada dasarnya Anda berurusan dengan kode diri memodifikasi, yang kebanyakan orang memutuskan adalah ide yang cukup buruk panjangwaktu lalu. Kedua, untuk membuatnya sangat bermakna, Anda perlu mengkompilasi kode baru ke dalam kelas yang ada untuk menanggapi pesan baru yang Anda dukung. Tanpa itu, yang Anda dapatkan hanyalah kemampuan untuk menambahkan nama baru secara dinamis untuk metode yang ada.
Seperti yang tersirat pada akhir paragraf sebelumnya, dari sudut pandang yang benar-benar praktis, hanya ada sedikit perbedaan di antara keduanya. Mereka hanyalah dua (sangat sedikit) cara berbeda untuk mendukung ikatan yang terlambat. Meskipun pencarian berbasis pesan umumnya sedikit lebih lambat, itu akan sangat tidak biasa untuk perbedaannya menjadi benar-benar signifikan. Untuk tujuan paling praktis, mereka hanya dua cara berbeda untuk mencapai hal yang sama.
sumber
Di Objective-C, pesan terikat terlambat. Itu mereka diselesaikan pada saat runtime. C # mendukung konstruk serupa melalui kata kunci Dinamis yang menyatakan objek sebagai ikatan akhir juga.
sumber
Biasanya pemanggilan metode diselesaikan pada waktu kompilasi (kecuali jika Anda menggunakan refleksi di Java), sementara pesan di Objective C dikirim pada waktu berjalan.
sumber
struct
sebagai parameter pertama. Terlambat bindung adalah bagian penting dari polimorfisme dan karenanya OOP.Pesan ditangani oleh kernel atau oleh bahasa itu sendiri (untuk ObjC misalnya, ada kode perakitan sangat kecil yang melakukannya).
Dalam kernel linux misalnya, pesan dilakukan dengan panggilan sistem / fungsi: Anda dapat menemukannya jika Anda mencari tentang pemrograman sistem unix.
Perbedaan utama antara pemanggilan metode dan pesan adalah ini:
pemanggilan metode hanya terjadi di kode Anda: di ASM itu diterjemahkan oleh PUSH dari argumen yang diteruskan.
pesan kernel sebagian besar adalah sesuatu yang dikirim ke kernel yang dilacak dan dikirim kembali ke proses tertentu. Saya mungkin mengira mereka untuk pipa, tetapi apa pun: tahu sudah ada mekanisme yang memungkinkan Anda untuk menjalankan beberapa program pada saat yang sama dan membiarkan berkomunikasi pada saat yang sama. Tentu saja, jangan berharap ini akan bekerja dengan cara yang sama pada windows atau OS lainnya.
sumber