web-dev-qa-db-ja.com

ios-NSObjCRuntime、NSZone、およびNSObjectの解析の問題

IOSアプリに共有オプションを追加するために AddThis を使用しています。

クラスをインポートし、ARCを使用しないため、インポートしたすべてのクラスに-fno-objc-arcフラグを追加しました。

ただし、アプリを実行しようとすると、次のような多数の解析の問題が発生します。

Expected identifier or '('
Unknown type name 'NSString'
Unknown type name 'Protocol'
...

これらのエラーは、NSObjCRuntime、NSZone、およびNSObjectで発生します。必要なフレームワークも含まれています。何か案は?

役立つ場合は、この画像を含めます。 image

38
soleil

Base64Transcoder.cのファイル名をBase64Transcoder.mに変更したところ、プロジェクトがコンパイルされました。これで問題が解決する理由はわかりませんが、機能します。

21
soleil

Cコード(.hおよび.c)をObjective-Cコードと混合しようとしたときに、プロジェクトで同じ問題が発生しました。問題の理由を見つけました:

.pchファイルをチェックして、すべてのObjective-Cフレームワークの#import(#import <UIKit/UIKit.h>)は以下で囲まれています。

#ifdef __OBJC__

#endif

それらがこの条件付きスコープの外にある場合、コンパイラはObjective-CフレームワークをCソースコードにインポートしようとします。

お役に立てば幸いです。

126
horacex

プロジェクトに.cppファイルが含まれていたときにも同じ問題が発生しました。

.cppファイルにObjectiveCフレームワークが含まれていない場合(e.g.など)、「Default-C++ Source」タイプにする必要があります

enter image description here

ただし、.cppファイルにObjectiveCフレームワークがある場合-「Objective-C++ Source」として指定する必要があります

enter image description here

16
gaRik

Objective CでCおよびC++コードを使用して同じ問題が発生し、.pchがありません最も簡単な解決策は、ビルド設定->カスタムコンパイラフラグに移動し、「その他のCフラグ」を「-x目標」に設定することでした-c」および「その他のC++フラグ」を「-x Objective-c ++」に設定します

これはxCode 7.2でトリックを行います

16
Bastien

TLDR:PCHファイルに問題がない場合、CPPファイルヘッダーを調べて、Objective Cオブジェクトのヘッダーを誤って含めていないかどうかを確認します。

詳細:これは、C++クラスヘッダーに誤ってObjective-Cクラスヘッダーを間接的に含めていたために得られました。構造は次のとおりです。

Compass.hは純粋なObjective Cクラスを定義しました。

ActionTracker.hは、Objective Cの構造を(ActionTracker.mmを介して)理解するC++クラスを定義しました。

HelloWorld.hは、純粋にC++クラスを定義しました。

私の元の設定では、HelloWorld.hにはActionTracker.hが含まれていましたが、ActionTracker.hにはまだCompass.hが含まれていなかったため、これで問題ありませんでした。その後、コードを変更し、Compass.hをActionTracker.hに含めた後、HelloWorld.hに取り込み、これらのエラーが発生しました。

3
user1469569

Info.plistファイルをあるディレクトリから別のディレクトリに移動しようとしたときに、同じ問題が発生しました。これによりXCodeがトリガーされ、そのターゲットのビルドフェーズが編集され、「ソースのコンパイル」と「バンドルリソースのコピー」の量が大幅に増加しました。

幸いなことに、私のプロジェクトには、テストに使用する複数のターゲットがあります(つまり、アプリデモ、アプリ開発、アプリローカル、アプリ1.1、アプリ1.2など)

そのため、影響を受けていないターゲットの1つを複製して名前を変更し(バンドル識別子とビルドスキームの名前も変更しました)、影響を受けたのはプロジェクト全体ではなく、特定のターゲットのみであるため、これにより問題が明らかに修正されました。

解決策を試してみたい場合は、新しいターゲットを最初から作成するか、影響を受けていないターゲットを複製して名前を変更してください。

0
Matthys Du Toit