Проблема в том, что категории логически отделены от своих классов и даже хранятся отдельно в двоичном файле. Внутренняя реализация состоит в том, что структура описания класса содержит массив списков методов, который изначально содержит только список методов, определенных в основном блоке @implementation
. Когда модули компоновки ObjC загружают новые категории, их списки методов добавляются в этот массив.
Из-за этой реализации сами категории не имеют доступа к хранилищу для класса и, следовательно, не могут его изменить (это также поднимает вопрос о том, что делать, когда категория не загружена).
Наконец, с более логичной, а не технической точки зрения, идея заключается в том, что категория не имеет «владения» структурой класса в памяти, она просто связывает некоторые новые методы. Чтобы полностью поддерживать синтез свойств, необходимо каким-то образом изменить хранилище класса
Решение? Вы либо помещаете операторы @synthesize в свой основной блок @implementation, либо просто внедряете свои собственные средства доступа непосредственно в реализацию категории @.