无法识别的选择器在数组赋值时发送到实例
Unrecognized selector sent to instance on array assignment
我正在关注 this guide 创建简单的 iPhone 应用程序。
但是当我尝试启动它时,它失败并出现 unrecognized selector sent to instance
异常。
我调试了,失败在这一行:
masterController.bugs = bugs;
方法 (didFinishLaunchingWithOptions
)。
这是我的第一个应用程序,所以它应该是显而易见的。
我对教程中的代码所做的唯一更改:添加了 #import <UIKit/UIKit.h>
,否则它不允许编译代码。
完整方法代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
RWTScaryBugDoc *bug1 = [[RWTScaryBugDoc alloc] initWithTitle:@"Potato Bug" rating:4 thumbImage:[UIImage imageNamed:@"potatoBugThumb.jpg"] fullImage:[UIImage imageNamed:@"potatoBug.jpg"]];
RWTScaryBugDoc *bug2 = [[RWTScaryBugDoc alloc] initWithTitle:@"House Centipede" rating:3 thumbImage:[UIImage imageNamed:@"centipedeThumb.jpg"] fullImage:[UIImage imageNamed:@"centipede.jpg"]];
RWTScaryBugDoc *bug3 = [[RWTScaryBugDoc alloc] initWithTitle:@"Wolf Spider" rating:5 thumbImage:[UIImage imageNamed:@"wolfSpiderThumb.jpg"] fullImage:[UIImage imageNamed:@"wolfSpider.jpg"]];
RWTScaryBugDoc *bug4 = [[RWTScaryBugDoc alloc] initWithTitle:@"Lady Bug" rating:1 thumbImage:[UIImage imageNamed:@"ladybugThumb.jpg"] fullImage:[UIImage imageNamed:@"ladybug.jpg"]];
NSMutableArray *bugs = [NSMutableArray arrayWithObjects:bug1, bug2, bug3, bug4, nil];
UINavigationController *navController = (UINavigationController *) self.window.rootViewController;
MasterViewController *masterController = [navController.viewControllers objectAtIndex:0];
masterController.bugs = bugs;
// Override point for customization after application launch.
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
splitViewController.delegate = self;
return YES;
}
完整堆栈跟踪:
2015-01-19 10:06:10.489 ScaryBugs[6603:5904685] -[UINavigationController setBugs:]: unrecognized selector sent to instance 0x7d116690
2015-01-19 10:06:10.491 ScaryBugs[6603:5904685] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationController setBugs:]: unrecognized selector sent to instance 0x7d116690'
*** First throw call stack:
(
0 CoreFoundation 0x00951946 __exceptionPreprocess + 182
1 libobjc.A.dylib 0x005daa97 objc_exception_throw + 44
2 CoreFoundation 0x009595c5 -[NSObject(NSObject) doesNotRecognizeSelector:] + 277
3 CoreFoundation 0x008a23e7 ___forwarding___ + 1047
4 CoreFoundation 0x008a1fae _CF_forwarding_prep_0 + 14
5 ScaryBugs 0x000f65a8 -[AppDelegate application:didFinishLaunchingWithOptions:] + 1288
6 UIKit 0x00cfe97c -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 291
7 UIKit 0x00cff687 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 2869
8 UIKit 0x00d02c0d -[UIApplication _runWithMainScene:transitionContext:completion:] + 1639
9 UIKit 0x00d1b7d0 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke + 59
10 UIKit 0x00d0181f -[UIApplication workspaceDidEndTransaction:] + 155
11 FrontBoardServices 0x032919de __37-[FBSWorkspace clientEndTransaction:]_block_invoke_2 + 71
12 FrontBoardServices 0x0329146f __40-[FBSWorkspace _performDelegateCallOut:]_block_invoke + 54
13 FrontBoardServices 0x032a3425 __31-[FBSSerialQueue performAsync:]_block_invoke + 26
14 CoreFoundation 0x008751c0 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 16
15 CoreFoundation 0x0086aad3 __CFRunLoopDoBlocks + 195
16 CoreFoundation 0x0086a238 __CFRunLoopRun + 936
17 CoreFoundation 0x00869bcb CFRunLoopRunSpecific + 443
18 CoreFoundation 0x008699fb CFRunLoopRunInMode + 123
19 UIKit 0x00d011e4 -[UIApplication _run] + 571
20 UIKit 0x00d048b6 UIApplicationMain + 1526
21 ScaryBugs 0x000f853d main + 141
22 libdyld.dylib 0x02cb7ac9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
调试器信息,失败前:
UINavigationController *navController = (UINavigationController *) self.window.rootViewController;
MasterViewController *masterController = [navController.viewControllers objectAtIndex:0];
问题就在这里。该代码假定 window 的 rootViewController
是一个导航控制器,但它实际上可能是您的拆分视图控制器。然后,您请求这个假定但不是实际的导航控制器持有的第一个视图控制器,它是导航控制器本身。当然,导航控制器没有 bugs
属性,因此分配给它会导致异常。
您可能想要做的是获取对拆分视图控制器的第一个视图控制器的引用,然后获取返回的导航控制器的第一个视图控制器,这是您的实际 MasterViewController
.
我正在关注 this guide 创建简单的 iPhone 应用程序。
但是当我尝试启动它时,它失败并出现 unrecognized selector sent to instance
异常。
我调试了,失败在这一行:
masterController.bugs = bugs;
方法 (didFinishLaunchingWithOptions
)。
这是我的第一个应用程序,所以它应该是显而易见的。
我对教程中的代码所做的唯一更改:添加了 #import <UIKit/UIKit.h>
,否则它不允许编译代码。
完整方法代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
RWTScaryBugDoc *bug1 = [[RWTScaryBugDoc alloc] initWithTitle:@"Potato Bug" rating:4 thumbImage:[UIImage imageNamed:@"potatoBugThumb.jpg"] fullImage:[UIImage imageNamed:@"potatoBug.jpg"]];
RWTScaryBugDoc *bug2 = [[RWTScaryBugDoc alloc] initWithTitle:@"House Centipede" rating:3 thumbImage:[UIImage imageNamed:@"centipedeThumb.jpg"] fullImage:[UIImage imageNamed:@"centipede.jpg"]];
RWTScaryBugDoc *bug3 = [[RWTScaryBugDoc alloc] initWithTitle:@"Wolf Spider" rating:5 thumbImage:[UIImage imageNamed:@"wolfSpiderThumb.jpg"] fullImage:[UIImage imageNamed:@"wolfSpider.jpg"]];
RWTScaryBugDoc *bug4 = [[RWTScaryBugDoc alloc] initWithTitle:@"Lady Bug" rating:1 thumbImage:[UIImage imageNamed:@"ladybugThumb.jpg"] fullImage:[UIImage imageNamed:@"ladybug.jpg"]];
NSMutableArray *bugs = [NSMutableArray arrayWithObjects:bug1, bug2, bug3, bug4, nil];
UINavigationController *navController = (UINavigationController *) self.window.rootViewController;
MasterViewController *masterController = [navController.viewControllers objectAtIndex:0];
masterController.bugs = bugs;
// Override point for customization after application launch.
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
splitViewController.delegate = self;
return YES;
}
完整堆栈跟踪:
2015-01-19 10:06:10.489 ScaryBugs[6603:5904685] -[UINavigationController setBugs:]: unrecognized selector sent to instance 0x7d116690
2015-01-19 10:06:10.491 ScaryBugs[6603:5904685] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationController setBugs:]: unrecognized selector sent to instance 0x7d116690'
*** First throw call stack:
(
0 CoreFoundation 0x00951946 __exceptionPreprocess + 182
1 libobjc.A.dylib 0x005daa97 objc_exception_throw + 44
2 CoreFoundation 0x009595c5 -[NSObject(NSObject) doesNotRecognizeSelector:] + 277
3 CoreFoundation 0x008a23e7 ___forwarding___ + 1047
4 CoreFoundation 0x008a1fae _CF_forwarding_prep_0 + 14
5 ScaryBugs 0x000f65a8 -[AppDelegate application:didFinishLaunchingWithOptions:] + 1288
6 UIKit 0x00cfe97c -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 291
7 UIKit 0x00cff687 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 2869
8 UIKit 0x00d02c0d -[UIApplication _runWithMainScene:transitionContext:completion:] + 1639
9 UIKit 0x00d1b7d0 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke + 59
10 UIKit 0x00d0181f -[UIApplication workspaceDidEndTransaction:] + 155
11 FrontBoardServices 0x032919de __37-[FBSWorkspace clientEndTransaction:]_block_invoke_2 + 71
12 FrontBoardServices 0x0329146f __40-[FBSWorkspace _performDelegateCallOut:]_block_invoke + 54
13 FrontBoardServices 0x032a3425 __31-[FBSSerialQueue performAsync:]_block_invoke + 26
14 CoreFoundation 0x008751c0 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 16
15 CoreFoundation 0x0086aad3 __CFRunLoopDoBlocks + 195
16 CoreFoundation 0x0086a238 __CFRunLoopRun + 936
17 CoreFoundation 0x00869bcb CFRunLoopRunSpecific + 443
18 CoreFoundation 0x008699fb CFRunLoopRunInMode + 123
19 UIKit 0x00d011e4 -[UIApplication _run] + 571
20 UIKit 0x00d048b6 UIApplicationMain + 1526
21 ScaryBugs 0x000f853d main + 141
22 libdyld.dylib 0x02cb7ac9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
调试器信息,失败前:
UINavigationController *navController = (UINavigationController *) self.window.rootViewController;
MasterViewController *masterController = [navController.viewControllers objectAtIndex:0];
问题就在这里。该代码假定 window 的 rootViewController
是一个导航控制器,但它实际上可能是您的拆分视图控制器。然后,您请求这个假定但不是实际的导航控制器持有的第一个视图控制器,它是导航控制器本身。当然,导航控制器没有 bugs
属性,因此分配给它会导致异常。
您可能想要做的是获取对拆分视图控制器的第一个视图控制器的引用,然后获取返回的导航控制器的第一个视图控制器,这是您的实际 MasterViewController
.