Xcode 7.3 не може створити __слабке посилання у файлі за допомогою підрахунку посилань вручну


86

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

Відповіді:


176

Набір Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Releaseдля YES.

Наочний приклад

Взято з форумів розробників Apple - Xcode 7.3b4, non-arc, не може створити __слабке посилання .


7
Це все ще не працює для мене :( чи може існувати інший прапор компілятора, який замінює цей параметр, який я міг би ввімкнути? У мене активовані ці -Wall -Wextra -Wno-unused-parameterпопереджувальні прапори.
Kdawgwilk,

6
@Kdawgwilk Ви впевнені, що правильно ввімкнули цей прапор? Якщо це є у вашому проекті, ви можете просто видалити __weak ключове слово tho. Я не намагався, але ви також можете спробувати увімкнути прапор у проекті Pod, якщо ви використовуєте Pod
REALFREE

3
Зверніть увагу, якщо ви зараз виконуєте встановлення / оновлення стручків, тоді для слабких посилань у ручному збереженні випуску встановлено значення НІ для кожної цілі стручка - і вам доведеться знову редагувати параметри побудови.
Дамо,

2
Мені довелося це зробити і в налаштуваннях проекту стручків.
Бернард

чудова відповідь хлопці.
Bartłomiej Semańczyk

21

Це офіційна відповідь від Apple за посиланням:

Ця проблема поводиться належним чином, виходячи з наступного: Ми в процесі впровадження слабких посилань у всіх режимах мови Objective-C. Оскільки “__weak” історично ігнорувався в режимах, що не стосуються ARC (і не GC), ми додали цю помилку, щоб вказати місця, де семантика зміниться в майбутньому. Будь ласка, оновіть свій звіт про помилку, щоб повідомити нас, якщо це все ще залишається проблемою для вас.

Отже, в основному, якщо ви використовуєте Pod для сторонніх бібліотек, вам доведеться або видалити __weak у не ARC, або дочекатися оновлення.

Оновлення @ 3/23

Мені слід було б детальніше дослідити прапори, які я можу передати компілятору, щоб обійти ці певні речі. Але принципово не слід використовувати __weakв режимі, що не є ARC, щоб уникнути несподіваних конфліктів. Для користувачів cocoapods вам не потрібно видаляти __weakабо чекати оновлення, але встановити Weak References in Manual Retain Releaseпрапорець у налаштуваннях збірки на ТАК, як сказав Lean. Сподіваюся, це допоможе.


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

Чудова ідея! Це працює для мене, тому що я використовую Cocoapods. Дякую.
mginius

3
У мене виникла помилка: -fobjc-слабо не підтримується поточною метою розгортання
g212gs

Я також отримав помилку -fobjc-слабо, але мені вдалося її виправити, встановивши всі цілі розгортання стручків на 8.3 (моя ціль розгортання проекту). Ви можете зробити це за допомогою сценарію, як запропоновано у другому сценарії вище.
Xys

8

Вирішення для слабких посилань 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 як знайти слова магії, що. Дійсний XHTML.


1
Просто примітка: Схоже, FB змінив рядок, що порушує правила, у версії 3.x для версії 3.x. (Не впевнений щодо серії 4.x, але схоже, що він зараз там.)
big_m

7

Я знайшов це.

Думаю, це означає видалення __weak

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

Е-м, чи існувало коли-небудь таке поняття, як посилання на слабку змінну під MRR [ручне збереження-вивільнення]? "__слабкий" означає одну або обидві з двох речей:

  1. Невідоме посилання (тобто не відображає кількість утримань).

  2. Посилання на занулення (тобто, що час виконання дорівнює нулю при звільненні об'єкта, на який посилається).

№1 не застосовується до MRR, оскільки ви все одно просто не зберігаєте змінну.

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

Здається, компілятор зараз просто скаржиться, що не може зробити те, що ніколи не міг. (А у випадку делегата програми ви не зможете визначити різницю під час виконання, оскільки делегат програми, як правило, ніколи не вивільняється.)


1

Просто перейдіть до своєї цілі на вкладці "Фази побудови", знайдіть файли pod в "Компілювати джерела", клацніть на них та додайте прапор компілятора "-fobjc-arc"


0

Або змінити __weakна __unsafeunretained. Це дозволить вирішити проблему традиційно. Оскільки MRC (до xCode 4 -) __weak не був у iOS.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.