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

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

Ответ 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, как найти слова волшебства. Valid XHTML.

Ответ 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.