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