ARC и слабые свойства IBOutlet
Я только что обновил проект, чтобы использовать ARC с встроенным инструментом преобразования Xcode 4.2. К сожалению, появляется странная ошибка, я не понимаю и ничего не нашел. У меня есть класс документа с объявлением свойства:
@property (weak) IBOutlet WebView *webView;
В файле реализации у меня есть оператор @synthesize:
@synthesize webView=_webView;
Когда я пытаюсь скомпилировать его, он терпит неудачу и говорит мне:
error: @synthesize свойства 'weak' разрешено только в ARC или GC Режим
Конечно, проект помечен для компиляции с ARC. Я был бы очень признателен за любую помощь, чтобы понять, что я делаю неправильно и почему.
Изменить: вчера был поздно. Итак, вот более полный журнал компиляции:
[...] -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Wmissing-prototypes -Wreturn-type -Wparentheses -Wswitch -Wno-unused-parameter -Wunused-variable -Wunused-value -Wshorten -64-to-32 -DDEBUG = 1 -isysroot/Developer/SDKs/MacOSX10.7.sdk -fasm-blocks -mmacosx-version-min = 10.7 -gdwarf-2 -Wno-sign-conversion "-DIBOutlet = атрибут ((iboutlet))" "-DIBOutletCollection (ClassName) = атрибут ((iboutletcollection (ClassName)))" "-DIBAction = void) атрибут ((ibaction)" -iquote [...]/Build/Intermediates/[...]. build/Debug/[...]. build/[...]- generated-files.hmap -I [...]/Build/Intermediates/[...]. Build/Debug/[...]. Build/[...]- own-target-headers.hmap -I [...]/Build/Intermediates/[...].build/Debug/[...].build/[...]-all-target-headers.hmap -iquote [...]/Build/Intermediates/[...]. build/Debug/[...]. build/[...]- project-headers.hmap -I [...]/Build/Products/Debug/include -I [...]/Build/Intermediates/[...]. build/Debug/[...]. build/DerivedSources/x86_64 -I [...]/Build/Intermediates/[...]. Build/Debug/[...]. Build/DerivedSources -F [...]/Build/Products/Debug -fno-objc-arc [...]
Кажется, что параметры компилятора для ARC включены в начале и снова выключены позже в списке аргументов. Честно говоря: я не знаю, где можно удалить такие странные настройки и как это получилось. Единственное решение, которое я придумал сейчас, - это запустить полный проект из пустого и нового и импортировать все файлы классов с нуля.
Если кто-то знает более простой способ, я был бы очень признателен.
PS: У меня есть все настройки сборки, связанные с настройкой ARC на YES.
Ответы
Ответ 1
Я взял еще немного времени и сделал новое преобразование из предыдущего коммита проекта. На этот раз все прошло хорошо. Я предполагаю, что эта ошибка возникла из меня, пытаясь сделать преобразование в 2 отдельных шага. Проект разбит на 2 компонента. Я хотел их преобразовать отдельно. Вот почему я не выбрал все файлы во время первого запуска преобразования. К моему удивлению, первое обращение происходило очень безболезненно и в более короткие сроки, чем я ожидал. Поэтому я решил преобразовать второй компонент проекта. То, что я закончил, было состояние проекта, описанное как проблема выше: конфликтующие настройки сборки.
Хорошим советом может быть не пытаться преобразовать проект поэтапно, а взять еще пару раз и сделать это сразу. Я должен предположить: функция преобразования Xcode может не предназначаться для такой процедуры.
Ответ 2
В только ARC мы должны использовать свойство weak
, и без ARC мы должны использовать unsafe_unretained
, это то же самое средство для ARC мы должны использовать
@property (weak) IBOutlet WebView *webView;
и без ARC
@property(unsafe_unretained) IBoulet WebView *webView;
Ответ 3
FYI: для всех, кого преследует "@synthesize" слабого "свойства, разрешается только в режиме ARC или GC":
Если вы пробовали все решения, предлагаемые в этом потоке, и он все равно не будет создан, попробуйте закрыть проект Xcode (Файл > Закрыть проект), затем повторно открыть проект и попытаться создать еще раз.
Ответ 4
Для всех, кто работает в этом случае, если вы преобразовали свой проект в части в ARC, убедитесь, что в файлах, на которые он жалуется, нет флага -no-obj-arc.
Ответ 5
Попробуйте явно указывать с помощью -fobjc-arc в качестве флагов компилятора в фазах сборки
Ответ 6
В случае, если кто-то еще наткнется на это:
Я просто исправил эту проблему, установив "Objective-C Garbage Collection" в "Unsupported" в настройках сборки. По какой-то причине это было установлено в YES, и это привело к тому, что сборка ARC не работала.
Ответ 7
Хорошо, на всякий случай у кого-то есть такая же проблема, как и я, я добавлял элементы пользовательского интерфейса как свойства ниже закрывающего "}" моего @interface, а не изнутри. Как только я удалил записи @property и @synthesize в файлах .h/.m и повторно связал элементы пользовательского интерфейса в разделе @interface {}, он сработал.
Ответ 8
В моем случае я обнаружил, что изменение настройки сборки "Компилятор для C/С++/ Objective-C" в категории "Параметры сборки" по умолчанию ( "Apple LLVM compiler 3.0" ) разрешило эту проблему.
Он был установлен в "LLVM GCC 4.2", а далее в категории "... complier 3.0 - Language" опция выбора ARC ( "Objective-C Автоматический подсчет ссылок" ) была даже не видна.
Это было особенно странно, потому что у меня есть другой проект, ранее преобразованный в ARC, и хотя выбранный компилятор был также "LLVM GCC 4.2", тем не менее категория "Язык" по-прежнему называлась "Apple LLVM compiler 3.0", а опция выберите ARC.
Выбран один и тот же компилятор, но для него есть разные варианты. Weird.
Ответ 9
Я также столкнулся с той же проблемой. Ошибка, которую я совершил, заключалась в том, что в Build Phases- > Compile Sources я устанавливаю флаг файла без ARC как "-fno-objc-arc". Я хотел, чтобы он был добавлен в файл без ARC. Я удалил его, и он начал работать правильно.