Можно ли сделать все возможные свойства @dynamic в Objective-C?

У меня есть вопрос, похожий на этот, но мне любопытно узнать, есть ли какой-либо способ (флаг компилятора, @-directive и т. Д.), Который позволяет классу иметь все возможные свойства, рассматриваемые как @dynamic во время компиляции, чтобы вы могли код против любого произвольного свойства без явного объявления его как @dynamic.

Например, я мог бы просто сделать это:

myObject.anyPropertyName = someObject;

... так же, как вы можете сделать в JavaScript, без необходимости объявлять @dynamic anyPropertyName,

1 ответ

Решение

То, что вы хотите, не возможно. Компилятор не позволит вам отправить любое сообщение без того, чтобы этот селектор был объявлен ранее. Это, конечно, включает в себя доступ к свойствам. Это необходимо, чтобы компилятор мог знать, какие типы ожидать - не все является объектом. Компилятор должен генерировать другой код для объектов (например, ARC), структур или скаляров.

Среда выполнения, с другой стороны, была бы рада справиться с этим, не объявив эти свойства. Но тогда ваша работа будет называть правильный вариант objc_msgSend бросил на правильную подпись. Это, конечно, требует кода, который намного страшнее, чем просто использование valueForKey: а также setValue:forKey: непосредственно.

Также @dynamic не имеет к этому никакого отношения. Все @dynamic do - закрывает компилятор на предмет отсутствующих реализаций для методов получения и установки и предотвращает их автоматическую генерацию. Это способ пообещать компилятору, что во время выполнения эти сообщения будут обрабатываться. Использование @dynamic автоматически не перенаправляет доступ к свойству в valueForKey: и setValue:forKey:.

Другие вопросы по тегам