Xcode 7.3 не может создать __weak ссылку в файле с помощью ручного подсчета ссылок

86

После обновления до Xcode 7.3 он выдает ошибку Cannot create __weak reference in file using manual reference countingв файлах pod. Кто-нибудь решил эту проблему?

REALFREE
источник

Ответы:

176

Установите Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Releaseна YES.

Наглядный пример

Взято с форумов разработчиков Apple - Xcode 7.3b4, без дуги, не может создать __weak ссылку .

Райан
источник
7
У меня это по-прежнему не работает :( Может ли быть другой флаг компилятора, который отменяет этот параметр, который я мог включить? У меня включены эти -Wall -Wextra -Wno-unused-parameterпредупреждающие флаги.
Kdawgwilk
6
@Kdawgwilk Вы уверены, что правильно включили этот флаг? Если он есть в вашем проекте, вы можете просто удалить ключевое слово __weak tho. Я не пробовал, но вы также можете попробовать включить флаг в проекте Pod, если используете Pod
REALFREE
3
Обратите внимание: если вы в настоящее время запускаете установку модуля / обновление модуля, то для слабых ссылок в ручном удержании выпуска установлено значение НЕТ для каждого целевого модуля, и вам придется снова изменить настройки сборки.
Дамо
2
Мне также пришлось сделать это в настройках проекта модуля.
Бернар
классный ответ, ребята.
Бартломей Семанчик
21

Это официальный ответ Apple по ссылке:

Эта проблема ведет себя так, как задумано, исходя из следующего: Мы находимся в процессе реализации слабых ссылок во всех режимах языка Objective-C. Поскольку «__weak» исторически игнорировалось в языковых режимах, отличных от ARC (и без GC), мы добавили эту ошибку, чтобы указать места, где семантика изменится в будущем. Пожалуйста, обновите свой отчет об ошибке, чтобы сообщить нам, сохраняется ли у вас эта проблема.

Таким образом, если вы используете Pod для сторонних библиотек, вам нужно либо удалить __weak в не-ARC, либо дождаться обновления.

Обновление @ 3/23

Мне нужно было больше узнать о флагах, которые я могу передать компилятору, чтобы обойти подобные вещи. Но принципиально с этого момента вы не должны использовать __weakрежим без ARC, чтобы избежать любых неожиданных конфликтов. Для пользователей cocoapods вам не нужно удалять __weakили ждать обновления, но установите Weak References in Manual Retain Releaseфлаг в настройках сборки на YES, как сказал Лин. Надеюсь на эту помощь.

REALFREE
источник
1
Обратите внимание: если вы в настоящее время запускаете установку модуля / обновление модуля, то для слабых ссылок в ручном удержании выпуска установлено значение НЕТ для каждого целевого модуля, и вам придется снова изменить настройки сборки.
Дамо
20

Лучший способ решить эту проблему - добавить post_installв ваш подфайл скрипт, который устанавливает Weak References in Manual Retain Releaseфлаг для yesвсех целей вашего пода. Для этого просто вставьте следующий код внизу файла Podfile.

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
        end
    end
end

Иногда это приводит к ошибке -fobjc-weak is not supported on the current deployment target. Вы можете решить эту проблему, добавив еще один параметр конфигурации, заставив все модули нацеливаться на нужную вам версию ( на основе этого ответа ):

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
            config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.3'
        end
    end
end
villy393
источник
Отличная идея! У меня это работает, потому что я использую Cocoapods. Спасибо.
mginius
3
У меня следующая ошибка: -fobjc-weak не поддерживается в текущей цели развертывания
g212gs
Я также получил ошибку -fobjc-weak, но мне удалось исправить ее, установив для всех целевых модулей значение 8.3 (цель развертывания моего проекта). Вы можете сделать это с помощью сценария, как предложено во втором сценарии выше.
Xys
8

Обход слабых ссылок Facebook в FBSettings.m

В Podfile можно написать сценарий для запуска после установки / обновления модуля, там описывается следующее.

 
post_install do | installer |
     classy_pods_target = installer.pods_project.targets.find {| target | target.name == 'Facebook-iOS-SDK'}
     classy_pods_target.build_configurations.each do | config |
         config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
     end
 end

CLANG_ENABLE_OBJC_WEAK как найти слова волшебства, что. Действительный XHTML.

Манобала
источник
1
Просто примечание: похоже, что FB изменили вызывающую ошибку строку в v3.24.4 для строки выпуска 3.x. (Не уверен насчет серии 4.x, но не похоже, что она там сейчас.)
big_m
7

Я нашел это.

Я думаю, это означало удалить __weak

https://forums.developer.apple.com/thread/38934

Эээ, была ли когда-либо такая вещь, как слабая ссылка на переменную в MRR [ручное сохранение-выпуск]? «__weak» означает одно или оба из двух:

  1. Незарегистрированная ссылка (т. Е. Не представляющая счетчик удержания).

  2. Ссылка обнуления (т. Е. Обнуление среды выполнения при освобождении объекта, на который указывает ссылка).

# 1 не применяется к MRR, потому что вы все равно не сохраняете переменную.

# 2 также не применяется к MRR, потому что поддержка времени выполнения находится в GC и ARC [автоматический подсчет ссылок], которые вы не используете.

Похоже, компилятор сейчас просто жалуется, что не может сделать то, чего никогда не мог. (А в случае делегата приложения вы не сможете заметить разницу во время выполнения, поскольку делегат приложения обычно никогда не освобождается.)

недостаток
источник
1

Просто перейдите к своей цели на вкладке «Build Phases», найдите файлы pod в «Compile Sources», щелкните эти файлы и добавьте флаг компилятора «-fobjc-arc»

пески
источник
0

Или измените __weakна __unsafeunretained. Это решит проблему по традиции. Поскольку MRC (до xCode 4 -) __weak не было в iOS.


источник