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