Хотя перегрузка @
начинает наступать на опасную территорию, мне нравится добавлять новые литералы Objective-C в Clang 3.1. К сожалению, новые литералы для меня ограничены. За исключением случаев, когда код должен взаимодействовать с AppKit, я в основном отказался от использования классов Foundation в пользу собственной собственной инфраструктуры (по разным причинам, большинство из которых заключается в том, что мне нужен прямой контроль над используемыми шаблонами распределения памяти по объектам).
Я всегда мог использовать некоторую хитрость времени выполнения, чтобы передать вновь созданный объект в качестве моего собственного класса (и это то, что я уже должен делать с литералами строковых объектов, поскольку только среда выполнения без использования Apple поддерживает флаг -fconstantstring=class
)., но это взлом в лучшем случае и выбрасывает все преимущества, которые я получил, заменив эквивалентный класс Foundation для начала.
В отличие от литералов строковых объектов, новые литературные инструменты Clang не являются фактически постоянными классами (где макет памяти жестко запрограммирован); вместо этого соответствующие сообщения отправляются в соответствующие классы для создания и инициализации нового объекта во время выполнения. Эффект ничем не отличается, если вы сами создали объект. Теоретически это означает, что используемые классы и методы, называемые новыми литералами, не являются жестко закодированными. На практике я не могу найти способ изменить их, чтобы указать на мои собственные пользовательские классы и методы (на самом деле я был бы счастлив просто указать на собственный класс, указывая на фиктивный метод на фактический метод во время выполнения, не сложно).
Когда я впервые заглянул в это, я действительно надеялся найти набор флагов, которые можно было бы использовать для того, чтобы делать то, что я прошу, но так как я их не нашел, я надеюсь, что у кого-то есть решение.