Jawabannya adalah ... baik ... sederhana. Kesederhanaan dan konsistensi sebenarnya.
Objective-C murni dinamis pada saat pengiriman metode. Secara khusus, setiap pengiriman metode melewati titik resolusi metode dinamis yang sama persis seperti setiap pengiriman metode lainnya. Saat runtime, setiap implementasi metode memiliki eksposur yang sama persis dan semua API yang disediakan oleh runtime Objective-C yang bekerja dengan metode dan penyeleksi bekerja sama di semua metode.
Seperti yang telah dijawab banyak orang (baik di sini dan di pertanyaan lain), metode privat waktu kompilasi didukung; jika sebuah kelas tidak mendeklarasikan metode dalam antarmuka yang tersedia untuk umum, maka metode itu mungkin juga tidak ada sejauh menyangkut kode Anda. Dengan kata lain, Anda dapat mencapai semua dari berbagai kombinasi visibilitas yang diinginkan pada waktu kompilasi dengan mengatur proyek Anda secara tepat.
Ada sedikit manfaat untuk menduplikasi fungsionalitas yang sama ke dalam runtime. Ini akan menambah kerumitan dan overhead yang luar biasa. Dan bahkan dengan semua kerumitan itu, itu tetap tidak akan mencegah semua kecuali pengembang yang paling biasa untuk menjalankan metode yang Anda anggap "pribadi".
EDIT: Salah satu asumsi yang saya perhatikan adalah bahwa pesan pribadi harus melalui waktu proses sehingga berpotensi menimbulkan overhead besar. Apakah ini benar?
Ya itu. Tidak ada alasan untuk menganggap bahwa implementor kelas tidak ingin menggunakan semua set fitur Objective-C dalam implementasi, dan itu berarti pengiriman dinamis harus terjadi. Namun , tidak ada alasan khusus mengapa metode privat tidak dapat dikirim oleh varian khusus objc_msgSend()
, karena kompilator akan tahu bahwa metode privat; yaitu hal ini dapat dicapai dengan menambahkan tabel metode khusus pribadi ke Class
struktur.
Tidak akan ada cara bagi metode pribadi untuk melakukan hubungan pendek pada pemeriksaan ini atau melewati runtime?
Itu tidak bisa melewati waktu proses, tetapi waktu proses tidak perlu melakukan pemeriksaan apa pun untuk metode pribadi.
Meskipun demikian, tidak ada alasan bahwa pihak ketiga tidak dapat dengan sengaja memanggil objc_msgSendPrivate()
suatu objek, di luar implementasi objek tersebut, dan beberapa hal (KVO, misalnya) harus melakukan itu. Akibatnya, ini hanya akan menjadi konvensi dan sedikit lebih baik dalam praktiknya daripada mengawali pemilih metode pribadi atau tidak menyebutkannya di header antarmuka.
Namun, melakukan hal itu akan merusak sifat dinamis murni bahasa tersebut. Setiap metode pengiriman tidak lagi melalui mekanisme pengiriman yang identik. Sebaliknya, Anda akan dibiarkan dalam situasi di mana sebagian besar metode berperilaku satu arah dan segelintir kecil hanya berbeda.
Ini melampaui runtime karena ada banyak mekanisme di Cocoa yang dibangun di atas dinamisme Objective-C yang konsisten. Misalnya, Pengkodean Nilai Kunci dan Pengamatan Nilai Kunci harus dimodifikasi secara besar-besaran untuk mendukung metode privat - kemungkinan besar dengan membuat celah yang dapat dieksploitasi - atau metode privat tidak akan kompatibel.