2013-05-16 2 views
-2

Технология ARC не используется в моем проекте. Я пытаюсь добавить библиотеку SBJson. Я устанавливаю флаг флагов -fobjc для всех файлов с префиксом SBJson, но во время процесса компиляции в семантике класса появляется нечеткая семантическая проблема ARC (указатель на неконтактный тип «id» без явного владения), который не связан с SBJSon. Почему это не работает?Использование библиотеки ARC в проекте, отличном от ARC

линия с ошибкой:

id *_controls; 

Я не могу показать вам мой код из-за коммерческой лицензии проекта, я ценю ваше понимание.

Компиляция проекта идет нормально, когда я использую более старую версию этой библиотеки (без ARC).

+0

вы можете как можно меньше указать строку ошибки – Ushan87

+0

try id _controls; без * – Ushan87

+0

Если вы установили '-fobjc-arc' только для файлов SBJson, почему ваш код' id * _controls; 'скомпилирован с ARC? –

ответ

3

Проблема в том, что вы смешиваете конструкцию, нарушающую ARC, в файлы ARC'd посредством включения. Вы не можете применить -fno-objc-arc к одному файлу заголовка, потому что это не имеет смысла.

Поскольку в файле заголовка вам необходимо использовать #if прагма для переключения между режимами поведения в зависимости от того, компилируется ли файл ARC или не ARC .m.

Лучшее решение, однако, должно устранить проблему полностью как для ARC, так и для ARC. Учитывая эту декларацию, она в значительной степени должна быть переменной экземпляра (хотя она может быть в структуре).

Если это ивар, полностью избавитесь от декларации. Либо выпустите его через @property, либо переместите его в файл .m, если он не должен отображаться в вашем общедоступном API. Учитывая тип, это действительно должно быть частная деталь реализации с публичным API, который делает доступ к содержимому немного меньше волшебства указателя.


В общем, использование языковых массивов C - массивы указателей - для хранения типов Objective-C настоятельно рекомендуется. Если _controls нужно обнародовать как общедоступную вещь (общедоступную для других классов в вашем проекте), то реорганизуйте свой код для использования класса коллекции (т. Е. Как правило, открытый гейтер NSArray* с внутренним хранилищем NSMutableArray* - например, subviews на UIView, например).

0

Как вы сказали в комментариях, предварительно скомпилированный заголовочный файл включает в себя заголовочный файл класса, который не предназначен для компиляции с помощью ARC. Это вызывает ошибку, поскольку предварительно скомпилированный заголовок также включается всеми файлами SBJson, которые скомпилированы с помощью ARC.

Я предлагаю удалить этот заголовочный файл класса из файла .pch и включить его только из исходных файлов, отличных от ARC, где это необходимо.

+0

К сожалению, я не могу удалить этот файл из .pch. Но я решил использовать статическую библиотеку SBJSon. – alexeyB