Почему я не могу @ синтезировать средства доступа в категории? - PullRequest
7 голосов
/ 18 мая 2009

Obj-C 2.0 позволяет мне объявлять свойства в категории, но компилятор отказывается синтезировать средства доступа внутри категории. Почему?

(Иногда в организации имеет смысл поместить кучу связанных вещей в категорию - даже если iVars для поддержки идут в объявлении класса. Я знаю о расширениях классов и о том, как делать частные свойства, но это не мое использование случай.)

Ответы [ 2 ]

8 голосов
/ 19 мая 2009

Проблема в том, что категории логически отделены от своих классов и даже хранятся отдельно в двоичном файле. Внутренняя реализация состоит в том, что структура описания класса содержит массив списков методов, который изначально содержит только список методов, определенных в основном блоке @implementation. Когда модули компоновки ObjC загружают новые категории, их списки методов добавляются в этот массив.

Из-за этой реализации сами категории не имеют доступа к хранилищу для класса и, следовательно, не могут его изменить (это также поднимает вопрос о том, что делать, когда категория не загружена).

Наконец, с более логичной, а не технической точки зрения, идея заключается в том, что категория не имеет «владения» структурой класса в памяти, она просто связывает некоторые новые методы. Чтобы полностью поддерживать синтез свойств, необходимо каким-то образом изменить хранилище класса

Решение? Вы либо помещаете операторы @synthesize в свой основной блок @implementation, либо просто внедряете свои собственные средства доступа непосредственно в реализацию категории @.

0 голосов
/ 18 мая 2009

Вопрос, заданный там, касается проблемы частного доступа. Это подходит от POV без частного доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...