9

iOS5 +プロジェクト(xcode 4.4.1 SDK 5.1)に取り組んでいます

私はユニットテストの中にこのコードを持っています:

[_appDelegate application:nil didFinishLaunchingWithOptions:nil];

UITabBarController *tabBarController = (UITabBarController*)_appDelegate.window.rootViewController;

NSArray *viewControllers = [tabBarController viewControllers];

UINavigationController *nc_1 = [viewControllers objectAtIndex:0];
UIViewController *vc_1 = nc_1.topViewController;

STAssertTrue([vc_1 isKindOfClass:[ScheduleViewController class]]==YES, @"UITabBarController first tab should be a ScheduleViewController class");

テストを実行すると、テストは失敗します。

だから私はデバッガーで確認します:

(lldb) po [ScheduleViewController class]
(id) $1 = 0x00142b04 ScheduleViewController
(lldb) po vc_1
(UIViewController *) $2 = 0x11a32dc0 <ScheduleViewController: 0x11a32dc0>
(lldb) print (BOOL) [vc_1 isKindOfClass:(Class)[ScheduleViewController class]]
(BOOL) $4 = YES
(lldb) po [vc_1 class]
(id) $5 = 0x00142b04 ScheduleViewController
(lldb) 

application:didFinishLaunchingWithOptionsで:ScheduleViewControllerを作成し、それをナビゲーションコントローラーのrootControllerとして使用します。デバッガーはそれが正しいと言います。上記のアサーションの何が問題になっているのかわかりません。

誰かがこれについて考えていますか?

アップデート

このassertの最初の実装は次のとおりです。

STAssertTrue([vc_1 isKindOfClass:[ScheduleViewController class]], @"UITabBarController first tab should be a ScheduleViewController class");

アサートも同じように失敗しました。

アップデート2

コメントで示唆されているように、私はアサートの前にこのコードを追加しようとします:

BOOL vcBool = [vc_1 isKindOfClass:[ScheduleViewController class]];

デバッガーを使用すると、次のようになります。

(lldb) print (BOOL) [vc_1 isKindOfClass:(Class)[ScheduleViewController class]]
(BOOL) $1 = YES
(lldb) print (BOOL) vcBool
(BOOL) $2 = NO
(lldb) 

アップデート3

コメントで示唆されているように、アサートの前にこの行を追加しました。

NSLog(@"vc_1=%@ class=%@", vc_1, NSStringFromClass([vc_1 class]));

デバッグコンソールから:

vc_1=<ScheduleViewController: 0x993bdb0> class=ScheduleViewController
4

3 に答える 3

22

私は解決策を見つけました。

これは、コメントで@vacawamaによってリンクされた投稿で提示されたソリューションの逆です。テストターゲットにもアプリターゲットのすべての*.mソースがありました。isKindOfClassの問題の解決策を探していたときに、テストセッションの開始時にコンソールに多くの警告が表示されていることに気付きました。警告は次のようになりました。

Class AClass is implemented in both /Application Support/iPhone Simulator/5.0/Applications/7FC68A9C-4F2C-4A30-85AD-87D8ABA7A275/App.app/App and /Developer/Xcode/DerivedData/App-fvbgaqbdupuoodgquxhlwbudpsin/Build/Products/Debug-iphonesimulator/App.octest/AppTests. One of the two will be used. Which one is undefined.

アプリケーションのすべての.mファイルをテストターゲットから削除しました。

これで、isKindOfClassは期待どおりに機能します。

皆様のご支援に感謝いたします。

于 2012-09-13T19:28:43.647 に答える
3

BOOL値をYESと直接比較しないでください。これがアサーションに問題を引き起こしている可能性があります。この問題の背景となるリファレンスは次のとおりです:http://mobiledevelopertips.com/objective-c/of-bool-and-yes.html

于 2012-09-12T11:28:44.693 に答える
1

NSStringFromClassを使用してクラス名を文字列に変換すると、isKindOfClassの問題が回避されます...例:

if ([NSStringFromClass([AViewController class]) isEqualToString:NSStringFromClass([BViewController class])])
于 2019-07-08T08:42:19.770 に答える