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


86

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

回答:


176

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

視覚的な例

Apple DevelopersForumsから取得-Xcode7.3b4、非アーク、__ weak参照を作成できません


7
これはまだ私のために動作しません:(私は私がこれらの持っている有効になっている可能性があることを、この設定よりも優先されます別のコンパイラフラグがあるかもしれない?-Wall -Wextra -Wno-unused-parameter有効に警告フラグを。
Kdawgwilk

6
@Kdawgwilkそのフラグを正しくオンにしてよろしいですか?プロジェクトに含まれている場合は、__ weakキーワードを削除するだけです。私は試しませんでしたが、ポッドを使用している場合は、ポッドプロジェクトでフラグをオンにすることもできます
REALFREE 2016年

3
現在ポッドインストール/ポッド更新を実行している場合は、手動保持リリースの弱参照が各ポッドターゲットに対してNOに設定されていることに注意してください。ビルド設定を再度編集する必要があります。
ダモ2016

2
ポッドプロジェクトの設定でもこれを行う必要がありました。
バーナード

素晴らしい答えの人。
パルトロミエSemańczyk

21

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

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

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

3/23に更新

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


1
現在ポッドインストール/ポッド更新を実行している場合は、手動保持リリースの弱参照が各ポッドターゲットに対してNOに設定されていることに注意してください。ビルド設定を再度編集する必要があります。
ダモ2016

20

これを解決する最善の方法は、すべてのポッドターゲットでフラグをpost_install設定するスクリプトをポッドファイルに追加することです。これを行うには、の下部に次のコードを貼り付けるだけです。Weak References in Manual Retain ReleaseyesPodfile

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 2016

3
次のエラーが発生しました:-fobjc-weakは現在のデプロイメントターゲットではサポートされていません
g212gs 2016年

-fobjc-weakエラーも発生しましたが、すべてのポッドデプロイメントターゲットを8.3(私のプロジェクトデプロイメントターゲット)に設定することで、なんとか修正できました。ただし、上記の2番目のスクリプトで提案されているように、スクリプトを使用してそれを行うことができます。
xys 2016

8

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

Podfileには、ポッドのインストール/更新後に実行するスクリプトを作成することができます。ここでは、次のように説明しています。

 
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リリースラインのv3.24.4で問題のあるラインを変更したようです。(4.xシリーズについてはよく
わかり

7

私はこれを見つけました。

私はそれが__weakを削除することを意味していると思います

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

えーと、MRR [手動保持リリース]での弱い変数参照のようなものはありましたか?「__weak」は、次の2つのいずれかまたは両方を意味します。

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

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

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

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

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


1

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


0

またはに変更__weak__unsafeunretainedます。これは伝統的な問題を解決します。MRC(xCode 4-より前)以降、__ weakはiOSにはありませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.