isKindOfClass无法按预期工作

Luc*_*tti 9 xcode objective-c llvm nsobject ios

我正在开发一个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");
Run Code Online (Sandbox Code Playgroud)

如果我运行测试,测试失败.

所以我检查调试器:

(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) 
Run Code Online (Sandbox Code Playgroud)

在应用程序中:didFinishLaunchingWithOptions:我创建一个ScheduleViewController,我将它用作导航控制器的rootController.调试器说它是正确的.我不明白上面的断言有什么问题.

有人对此有所了解吗?

更新

断言的第一个实现是:

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

断言以同样的方式失败.

更新2

正如评论中所建议的那样,我尝试在断言之前添加这段代码:

BOOL vcBool = [vc_1 isKindOfClass:[ScheduleViewController class]];
Run Code Online (Sandbox Code Playgroud)

使用调试器,我看到:

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

更新3

在断言之前,我按照评论中的建议添加了这一行:

NSLog(@"vc_1=%@ class=%@", vc_1, NSStringFromClass([vc_1 class]));
Run Code Online (Sandbox Code Playgroud)

从调试控制台:

vc_1=<ScheduleViewController: 0x993bdb0> class=ScheduleViewController
Run Code Online (Sandbox Code Playgroud)

Luc*_*tti 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.
Run Code Online (Sandbox Code Playgroud)

我从测试目标中删除了应用程序的所有.m文件.

现在isKindOfClass按预期工作.

感谢大家的支持.

  • 我遇到了类似的问题.它不是应用程序的源文件,而是来自应用程序目标和测试目标导入的另一个项目的静态库. (2认同)