1. ホーム
  2. cocoa

[解決済み】実行時に「Interface Builderファイル内の不明なクラス<MyClass>」というエラーが発生する。

2022-04-16 01:46:19

質問

Interface Builderは MyClass アプリケーションを起動するとエラーが発生します。

この現象は MyClass はライブラリの一部であり、アプリケーションターゲットで直接クラスをコンパイルした場合は発生しません。

解決方法は?

にもかかわらず、" Interface Builder ファイルに不明なクラス MyClass があります。 この問題は、Interface Builderとは関係なく、リンカーが、クラスを直接使用するコードがないためにリンクしていないことに起因しています。

.nibデータ(.xibからコンパイル)を実行時に読み込んだ場合。 MyClass が文字列で参照されていますが、リンカーはコードの機能を解析せず、コードの存在だけを解析するので、そのことはわかりません。 他のソースファイルはそのクラスを参照していないので、リンカーは実行ファイルを作るときにそのクラスを最適化して存在を消してしまうのです。 そのため、Appleのコードがそのようなクラスをロードしようとすると、それに関連するコードを見つけることができず、警告が表示されます。

デフォルトでは、Objective-Cのターゲットには -all_load -ObjC フラグがデフォルトで設定されており、すべてのシンボルが保持されます。 しかし、私はC++のターゲットから始めていたので、それを持っていなかった。 それでも、リンカーが攻撃的にならないようにする、これを回避する方法を見つけました。

私がもともと使っていたハックは、次のような空の静的ルーチンを追加することでした。

+(void)_keepAtLinkTime;

というように、何もしないが一度だけ呼び出すようなもの。

int main( int argc, char** argv )
{
   [MyClass _keepAtLinkTime];
   // Your code.
}

こうすることで、リンカーはクラス全体を保持するようになり、エラーは消えます。

コメントでjlstreckerさんが指摘されているように、本当は _keepAtLinkTime メソッドを使用します。 など、既存のものを呼び出すだけ。

   [MyClass class];

はトリックを実行します。 NSObject ).

もちろん、コードのどの場所でもこれを呼び出すことができます。 到達できないコードの中にあってもいいと思う。 このアイデアは、リンカを騙して MyClass がどこかで使われていれば、それほど積極的に最適化されることはないでしょう。

Xcode 6.3.2 & Swift 1.2

Swiftでのビューの定義。必ず init(coder aDecoder: NSCoder) . Objective-Cでのビューコントローラの定義。そして、梨の木に刺さったペン先。

Nib 詳細インスペクタにモジュール名を追加し、クラスを選択します。