1

これが私の質問に関連しているかどうかはわかりませんが、最初から始めます。私のプロジェクトでは、次のように、クラス名によって動的にインスタンス化されるビュー コントローラーがあります。

NSString* className;

...className is set to a valid class name, e.g. "someViewController"

Class c = NSClassFromString( className );
UIViewController* vc = [[c alloc] init];

プロジェクトの現在のビルドでは、someViewController単に特殊化された UIViewController です。ただし、プロジェクトの古いsomeViewControllerビルド (以前に私のデバイスにデプロイされていたもの) では、タイプのビュー コントローラーは特殊なUITableViewController.

今朝、デバイスでビルド (XCode からデプロイ) を実行すると、異常なコール スタックとコンソール メッセージでクラッシュする理由を理解しようと多くの時間を費やしました。

[someViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0xeb62a0

someViewController多くの実験を行った結果、を他のビュー コントローラと交換すると、問題を再現できないことがわかりました。そして、名前を変更someViewControllerした場合someViewController2、問題を再現できませんでした。問題はシンボル名にありsomeViewControllerました。それから、someViewController USEDが実装されUITableViewControllerていたはずであることに気づきました。tableView:numberOfRowsInSection:

いずれにしても; デバイスからアプリを削除し、XCode にクリーン コピーをデプロイさせると、問題が修正されました。

私が知りたいのは、なぜですか?どのように?デプロイ時に XCode がファンキーなことをすることを頭の片隅でしばらく知っていたと思います。古いリソースがプロジェクトから削除された後、デプロイされたバンドルに残るという問題が以前にありました。しかし、Objective-C の型に問題があるとは思っていませんでした。

4

1 に答える 1

0

.hおよび.mファイルの名前を変更してから、同じ名前の新しい.hおよび.mを導入するだけで、問題が発生します。xcodeではなく、あなたに。ファイルを/tmpのようなディレクトリにコピーし、プロジェクトから削除して、後で別の名前で新しいものとしてプロジェクトに追加することをお勧めします。

于 2012-06-20T21:10:41.793 に答える