Після оновлення до 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, non-arc, не може створити __слабке посилання .
Це офіційна відповідь від Apple за посиланням:
Ця проблема поводиться належним чином, виходячи з наступного: Ми в процесі впровадження слабких посилань у всіх режимах мови Objective-C. Оскільки “__weak” історично ігнорувався в режимах, що не стосуються ARC (і не GC), ми додали цю помилку, щоб вказати місця, де семантика зміниться в майбутньому. Будь ласка, оновіть свій звіт про помилку, щоб повідомити нас, якщо це все ще залишається проблемою для вас.
Отже, в основному, якщо ви використовуєте Pod для сторонніх бібліотек, вам доведеться або видалити __weak у не ARC, або дочекатися оновлення.
Оновлення @ 3/23
Мені слід було б детальніше дослідити прапори, які я можу передати компілятору, щоб обійти ці певні речі. Але принципово не слід використовувати __weak
в режимі, що не є ARC, щоб уникнути несподіваних конфліктів. Для користувачів cocoapods вам не потрібно видаляти __weak
або чекати оновлення, але встановити Weak References in Manual Retain Release
прапорець у налаштуваннях збірки на ТАК, як сказав Lean. Сподіваюся, це допоможе.
Найкращий спосіб вирішити це - додати 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 можна написати сценарій для запуску після встановлення / оновлення 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 як знайти слова магії, що. .
Я знайшов це.
Думаю, це означає видалення __weak
https://forums.developer.apple.com/thread/38934
Е-м, чи існувало коли-небудь таке поняття, як посилання на слабку змінну під MRR [ручне збереження-вивільнення]? "__слабкий" означає одну або обидві з двох речей:
Невідоме посилання (тобто не відображає кількість утримань).
Посилання на занулення (тобто, що час виконання дорівнює нулю при звільненні об'єкта, на який посилається).
№1 не застосовується до MRR, оскільки ви все одно просто не зберігаєте змінну.
№2 також не застосовується до MRR, оскільки підтримка виконання виконується в GC та ARC [автоматичний підрахунок посилань], якими ви не користуєтесь.
Здається, компілятор зараз просто скаржиться, що не може зробити те, що ніколи не міг. (А у випадку делегата програми ви не зможете визначити різницю під час виконання, оскільки делегат програми, як правило, ніколи не вивільняється.)
Або змінити __weak
на __unsafeunretained
. Це дозволить вирішити проблему традиційно. Оскільки MRC (до xCode 4 -) __weak не був у iOS.
-Wall -Wextra -Wno-unused-parameter
попереджувальні прапори.