Cevap ... şey ... basit. Aslında basitlik ve tutarlılık.
Objective-C, yöntem gönderimi sırasında tamamen dinamiktir. Özellikle, her yöntem gönderimi, diğer her yöntem gönderimi ile tamamen aynı dinamik yöntem çözüm noktasından geçer. Çalışma zamanında, her yöntem uygulaması tam olarak aynı görünürlüğe sahiptir ve yöntemlerle ve seçicilerle çalışan Objective-C çalışma zamanı tarafından sağlanan tüm API'ler tüm yöntemlerde eşit şekilde aynı şekilde çalışır.
Birçoğunun yanıtladığı gibi (hem burada hem de diğer sorularda), derleme zamanı özel yöntemler desteklenir; bir sınıf, genel kullanıma açık arabiriminde bir yöntem bildirmezse, o zaman kodunuz söz konusu olduğunda bu yöntem de mevcut olmayabilir. Başka bir deyişle, projenizi uygun şekilde düzenleyerek derleme sırasında istenen tüm çeşitli görünürlük kombinasyonlarını elde edebilirsiniz.
Aynı işlevselliği çalışma zamanına kopyalamak çok az fayda sağlar. Muazzam miktarda karmaşıklık ve ek yük getirir. Ve tüm bu karmaşıklığa rağmen, en sıradan geliştiricinin, sözde "özel" yöntemlerinizi yürütmesini engellemez.
DÜZENLEME: Fark ettiğim varsayımlardan biri, özel mesajların çalışma zamanından geçerek potansiyel olarak büyük bir ek yüke neden olması gerektiğidir. Bu kesinlikle doğru mu?
Evet öyle. Bir sınıfın uygulayıcısının uygulamadaki tüm Objective-C özelliğini kullanmak istemeyeceğini varsaymak için hiçbir neden yoktur ve bu dinamik gönderimin gerçekleşmesi gerektiği anlamına gelir. Ancak , özel yöntemlerin özel bir varyantı tarafından gönderilememesinin belirli bir nedeni yoktur objc_msgSend()
, çünkü derleyici özel olduklarını bilirdi; yani bu, Class
yapıya yalnızca özel bir yöntem tablosu eklenerek sağlanabilir .
Özel bir yöntemin bu kontrolü kısa devre yapmasının veya çalışma süresini atlamasının bir yolu yok mu?
Bu çalışma zamanını atlamak olamazdı, ama çalışma zamanı olmaz mutlaka özel yöntemler için herhangi kontrol yapmak zorundayız.
Bununla birlikte, bir üçüncü tarafın objc_msgSendPrivate()
bir nesneyi kasıtlı olarak o nesnenin uygulanmasının dışında arayamaması için hiçbir neden yoktur ve bazı şeyler (örneğin KVO) bunu yapmak zorunda kalır. Gerçekte, bu sadece bir kongre olur ve pratikte özel yöntemlerin seçicilerinin önekini koymaktan veya onlardan arayüz başlığında bahsetmemekten biraz daha iyidir.
Ancak bunu yapmak, dilin saf dinamik doğasının altını oyacaktır. Artık her yöntem gönderimi aynı bir gönderme mekanizmasından geçmeyecektir. Bunun yerine, çoğu yöntemin bir şekilde davrandığı ve küçük bir avucunun farklı olduğu bir durumda kalırsınız.
Cocoa'da Objective-C'nin tutarlı dinamizmi üzerine inşa edilmiş birçok mekanizma olduğundan, bu çalışma zamanının ötesine uzanır. Örneğin, hem Anahtar Değer Kodlaması hem de Anahtar Değer Gözleminin özel yöntemleri desteklemek için çok büyük ölçüde değiştirilmesi gerekir - büyük olasılıkla sömürülebilir bir boşluk yaratarak - ya da özel yöntemler uyumsuz olur.