0

ワークスペースに静的ライブラリがあります。その中に Apple.h & .m ファイルがあります .h ファイルで 2 つの @interface Apple を定義しました: NSObject & @interface GreenApple : NSObject

同じワークスペースに、この静的ライブラリを参照する別の iOS アプリケーション プロジェクトがあります。このアプリケーションで GreenApple を継承すると、デバイスとシミュレータ ビルドの両方で「未定義のシンボル」エラーが発生します。しかし、Apple から継承した場合はエラーになりません。

プロジェクト全体で、インポートされた .h と継承されたクラスは同じでなければなりません。または、Apple.h ファイルの下にあるにもかかわらず、私の GreenApple 継承は機能するはずですか?

編集

理論をテストするために、エラークラスに一致するようにファイルの名前を変更しましたが、それでも同じエラーです。実際の実装は、ファイル CMSGMealMenuItem.h から以下に示します。

@interface CMSGMealMenu : NSObject

@property (nonatomic, readonly) CMSGMealType mealType;
@property (nonatomic, readonly) NSDate *orderStartTime;
@property (nonatomic, readonly) NSDate *orderEndTime;
@property (nonatomic, readonly) NSArray *items;

@end

@interface CMSGMealMenuItem : NSObject

@property (nonatomic, readonly) NSString *itemId;
@property (nonatomic, readonly) NSString *itemDescription;
@property (nonatomic, readonly) NSString *itemSummary;
@property (nonatomic, readonly) NSNumber *itemPrice;

@end

CMSGMealMenuItem の継承は、.h ファイル名の一致が一致しないかどうかにかかわらず、常に未定義のシンボル エラーをスローします。しかし、それが CMSGMealMenu の定義とどのように違うのかわかりませんでしたか? それを継承してもエラーは発生しません。

編集

CMSGMealMenuItem をメソッド パラメーターとして参照しても、ビルド エラーは表示されず、継承した場合にのみエラーが表示されます。

これは機能します

@interface MSMealMenuItem : CMSGMealMenu

@property (nonatomic, retain) NSNumber *quantity;
@property (nonatomic, assign) BOOL isAddedToCart;

+ (MSMealMenuItem *) createMSMealMenuItemFromCMSGMealMenuItem:(CMSGMealMenuItem *)CMSGMealMenuItem;

@end

親を CMSGMealMenuItem に変更すると、以下のように未定義のシンボル エラーがスローされ、デバイスまたはシミュレーター用にビルドされます。

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_CMSGMealMenuItem", referenced from:
      _OBJC_CLASS_$_MSMealMenuItem in MSMealMenuItem.o
  "_OBJC_METACLASS_$_CMSGMealMenuItem", referenced from:
      _OBJC_METACLASS_$_MSMealMenuItem in MSMealMenuItem.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
4

2 に答える 2

0

私の間違い。適切なプロパティとメソッドを使用して @interface を定義し、実装を延期しました。ファイルの作成時に CMSGMealMenu @implementation が自動生成された場合、明示的に導入された @interface CMSGMealMenuItem の @implementation を配置できませんでした。

.h が定義されてリンクされている限り、コンパイルするのに適していると思いました。それがインポートするものだからです。ただし、継承中はそうではないようです。

ありがとう。

于 2013-09-04T04:05:47.853 に答える