web-dev-qa-db-ja.com

Xcode 7.3は、手動参照カウントを使用してファイルに__weak参照を作成できません

Xcode 7.3に更新した後、ポッドファイルにCannot create __weak reference in file using manual reference countingエラーがスローされます。誰かがこの問題を解決しましたか?

80
REALFREE

Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain ReleaseYESに設定します。

Visual example

Apple Developers Forums-Xcode 7.3b4、非アーク、__ weak参照を作成できません から取得。

173
Ryan

これは、リンクのAppleからの公式回答です。

この問題は、以下に基づいて意図したとおりに動作します。現在、すべてのObjective-C言語モードで弱参照を実装しています。 「__weak」は歴史的に非ARC(および非GC)言語モードでは無視されてきたため、このエラーを追加して、今後セマンティクスが変わる場所を指摘しました。バグレポートを更新して、これがまだ問題であるかどうかをお知らせください。

したがって、基本的に、サードパーティライブラリにPodを使用している場合は、非ARCで__weakを削除するか、更新を待つ必要があります。

@ 3/23に更新

これらの種類をバイパスするために、コンパイラーに渡すことができるフラグについてさらに調査する必要があります。しかし、基本的には、予期しない競合を避けるために、今後__weakを非ARCモードで使用しないでください。 cocoapodsユーザーの場合、__weakを削除したり、更新を待つ必要はありませんが、Leanが言ったように、ビルド設定でWeak References in Manual Retain ReleaseフラグをYESに設定します。この助けを願っています。

20
REALFREE

これを解決する最善の方法は、すべてのポッドターゲットでpost_installフラグをyesに設定するWeak References in Manual Retain ReleaseスクリプトをPodfileに追加することです。これを行うには、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
20
villy393

FBSettings.mのFacebook弱参照の回避策

ポッドファイルには、ポッドのインストール/更新後に実行するスクリプトを書くことができます。そこでは次のように説明されています。

 
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

8
Manobala

これを見つけました。

__weakを削除することを意味すると思います

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

えーと、MRR [manual retain-release]の下で弱い変数参照のようなものはありましたか? 「__weak」は、次の2つのうちの1つまたは両方を意味します。

  1. 所有されていない参照(つまり、保持カウントを表していない)。

  2. ゼロ化参照(つまり、参照されるオブジェクトの割り当てが解除されるとランタイムがゼロ化する)。

とにかく変数を保持しないため、#1はMRRには適用されません。

#2はMRRにも適用されません。これは、ランタイムサポートがGCとARC [自動参照カウント]にあり、使用していないためです。

コンパイラは、今までできないことを実行できないと不平を言っているようです。 (アプリデリゲートの場合、アプリデリゲートは通常割り当て解除されないため、実行時に違いを伝えることはできません。)

7
lack

[ビルドフェーズ]タブでターゲットに移動し、[ソースのコンパイル]でポッドファイルを探し、それらのファイルをクリックして、コンパイラフラグ "-fobjc-arc"を追加します。

1
peski

または、__weak__unsafeunretainedに変更します。これにより、従来の問題が解決されます。 MRC(xCode 4の前)以来、__ weakはiOSにはありませんでした。

0
user3693546