После обновления до Xcode 7.3 он выдает ошибку Cannot create __weak reference in file using manual reference counting
в файлах pod. Кто-нибудь решил эту проблему?
Ответы:
Установите Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release
на YES
.
Взято с форумов разработчиков Apple - Xcode 7.3b4, без дуги, не может создать __weak ссылку .
Это официальный ответ Apple по ссылке:
Эта проблема ведет себя так, как задумано, исходя из следующего: Мы находимся в процессе реализации слабых ссылок во всех режимах языка Objective-C. Поскольку «__weak» исторически игнорировалось в языковых режимах, отличных от ARC (и без GC), мы добавили эту ошибку, чтобы указать места, где семантика изменится в будущем. Пожалуйста, обновите свой отчет об ошибке, чтобы сообщить нам, сохраняется ли у вас эта проблема.
Таким образом, если вы используете Pod для сторонних библиотек, вам нужно либо удалить __weak в не-ARC, либо дождаться обновления.
Обновление @ 3/23
Мне нужно было больше узнать о флагах, которые я могу передать компилятору, чтобы обойти подобные вещи. Но принципиально с этого момента вы не должны использовать __weak
режим без ARC, чтобы избежать любых неожиданных конфликтов. Для пользователей cocoapods вам не нужно удалять __weak
или ждать обновления, но установите Weak References in Manual Retain Release
флаг в настройках сборки на YES, как сказал Лин. Надеюсь на эту помощь.
Лучший способ решить эту проблему - добавить 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
Обход слабых ссылок 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 как найти слова волшебства, что. .
Я нашел это.
Я думаю, это означало удалить __weak
https://forums.developer.apple.com/thread/38934
Эээ, была ли когда-либо такая вещь, как слабая ссылка на переменную в MRR [ручное сохранение-выпуск]? «__weak» означает одно или оба из двух:
Незарегистрированная ссылка (т. Е. Не представляющая счетчик удержания).
Ссылка обнуления (т. Е. Обнуление среды выполнения при освобождении объекта, на который указывает ссылка).
# 1 не применяется к MRR, потому что вы все равно не сохраняете переменную.
# 2 также не применяется к MRR, потому что поддержка времени выполнения находится в GC и ARC [автоматический подсчет ссылок], которые вы не используете.
Похоже, компилятор сейчас просто жалуется, что не может сделать то, чего никогда не мог. (А в случае делегата приложения вы не сможете заметить разницу во время выполнения, поскольку делегат приложения обычно никогда не освобождается.)
Или измените __weak
на __unsafeunretained
. Это решит проблему по традиции. Поскольку MRC (до xCode 4 -) __weak не было в iOS.
-Wall -Wextra -Wno-unused-parameter
предупреждающие флаги.