有人请给我开枪...
在我从 iPhone Developer's Cookbook 中写下的一段代码的帮助下,刚刚发现了问题。
问题不在于 SoundManager(幸运的是,它仍然可以正常工作!),而在于 App Delegate 类中的 application:didFinishLaunchingWithOptions: 方法。
这是在 iOS 4.2 中导致问题但在 iOS 3.2 中仍然有效的代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Create a Navigation Controller on the fly.
// Use the View Controller as root view controller.
viewController.title = @"ThreeSounds";
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];
nav.navigationBar.barStyle = UIBarStyleBlack;
// Add the view controller's view to the window and display.
[window addSubview:nav.view];
[nav release];
[window makeKeyAndVisible];
return YES;
}
解决方案:删除显示:[nav release] 的行。出于某种原因,在 iOS 3.2 中释放导航控制器不是问题。在 iOS 4.2 中,屏幕变白。
我发现这个方法是问题所在,因为它是最后执行的方法。反过来,我通过将这段代码添加到项目中的每个类中发现:
-(BOOL) respondsToSelector:(SEL)aSelector {
printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);
return [super respondsToSelector:aSelector];
}
这段代码记录了所有被调用的方法。