Можно ли сделать все возможные свойства @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:.