Відповідь ... ну ... проста. Простота і послідовність насправді.
Objective-C є чисто динамічним на момент відправки методу. Зокрема, кожна відправка методу проходить через таку ж точку динамічної роздільної здатності методу, що і кожна інша методика відправки. Під час виконання кожна реалізація методу має точно однакове опромінення, і всі API, передбачені програмою Objective-C, які працюють з методами та селекторами, працюють однаково для всіх методів.
Оскільки багато хто відповів (і тут, і в інших питаннях), підтримуються приватні методи компіляції за часом; якщо клас не оголошує метод у своєму загальнодоступному інтерфейсі, він може також не існувати, що стосується вашого коду. Іншими словами, ви можете досягти всіх різних комбінацій видимості, бажаних під час компіляції, організувавши свій проект належним чином.
Дублювати таку функціональність під час виконання мало користі. Це додало б величезної складності та витратних витрат. І навіть при всій цій складності це все-таки не завадить усім, крім самого випадкового розробника, виконувати ваші нібито "приватні" методи.
EDIT: Одне з припущень, які я помітив, - це те, що приватні повідомлення повинні пройти через час виконання, що призведе до потенційно великих витрат. Це абсолютно правда?
Так. Немає жодних причин вважати, що реалізатор класу не захотів би використовувати всю функцію Objective-C, встановлену в реалізації, і це означає, що динамічна відправка повинна відбуватися. Однак немає жодної конкретної причини, по якій приватні методи не могли бути відправлені спеціальним варіантом objc_msgSend()
, оскільки компілятор знав би, що вони приватні; тобто цього можна досягти, додавши до структури приватну таблицю методів Class
.
Не було б способу, щоб приватний метод коротко замикав цю перевірку або пропускав час виконання?
Він не міг пропустити час виконання, але час виконання не обов'язково повинен був перевіряти приватні методи.
Це означає, що немає жодних причин, щоб сторона не могла навмисно закликати objc_msgSendPrivate()
об'єкт поза межами реалізації цього об'єкта, і деякі речі (наприклад, KVO) повинні були це зробити. Фактично, це було б просто умовою і мало кращою на практиці, ніж префіксація селекторів приватних методів або не згадування про них у заголовку інтерфейсу.
Однак це може підірвати чисту динамічну природу мови. Більше не кожен метод відправки проходитиме через ідентичний механізм диспетчеризації. Натомість ви опинилися б у ситуації, коли більшість методів веде себе в один бік, а невелика жменька - просто по-іншому.
Це виходить за рамки часу виконання, оскільки в Какао існує багато механізмів, побудованих на основі послідовної динамічності об'єктива-С. Наприклад, і кодування ключових значень, і спостереження ключових значень повинні або бути дуже сильно модифіковані для підтримки приватних методів - швидше за все, шляхом створення експлуатованої лазівки - або приватні методи будуть несумісними.