「別の種類のシンボルとしての「カテゴリ」の再発生」とOBJCランタイムクラス名との対立

StackOverflow https://stackoverflow.com/questions/20353408

  •  25-08-2022
  •  | 
  •  

質問

私はObjective-Cのクラスを持っています:

@interface Category : NSObject
{
// ...
}

すべてが良かったです 私はこのクラスを3つの異なるプロジェクトで問題なく使用しました。

一度、1つのプロジェクトのテストターゲットを作成することにしました。それから奇妙なことが起こりました:コンパイラはこのエラーでコンパイルすることを拒否します:

Redefenition of 'Category' as a different kind of symbol

それはまた指し示しました runtime.h

typedef struct objc_category *Category;

まあ、それは合理的です。

ただし、なぜこのクラスを以前に使用できるようになったのか、元のターゲットとテストターゲットの違いは何ですか。チェックしました Deploy target, iOS SDK, 、すべてのマクロ、ヘッダーパス、 #import <objc/runtime.h> 両方のターゲットのクラス - これらはほぼ同じです。

Multiples Projectsで使用しているため、このクラスの名前をリファクタリングしたくないので、そのような動作の理由は何ですか?

役に立ちましたか?

解決

とにかくこのクラスの名前をリファクタリングして、将来のこのような衝突を避ける必要があります。そして、後でよりも早くやるのは痛みが少なくなります。

インポートするファイルをインポートする可能性があります <objc/runtime.h> ある時点で。テストターゲットと通常のターゲットの違いの問題として、Xcodeテストでは、シンボルをバンドルに注入することで機能します。この種のエラーを説明できるコードストリッピングとシンボルの可視性にいくつかの違いがあるかもしれません。

不思議ではありません Appleは2文字または3文字でクラスをプレフィックスすることをお勧めします

他のヒント

@olotiarが彼の答えで言うことをするべきですが、簡単な修正があります。

あなたのプロジェクトに行きます ビルド設定, 、 検索する "モジュール(CおよびObjective-C)を有効にする「そして、値を設定します いいえ.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top