试试:
int main(int argc, char *argv[])
{
NSLog(@"Step 0");
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"Step 1");
int retVal = UIApplicationMain(argc, argv, nil, nil);
NSLog(@"Step 2");
[pool release];
NSLog(@"Step 3");
return retVal;
}
可能是池的释放阻止了进一步的日志记录,在这种情况下,您将获得第 2 步而不是第 3 步。
如果没有打印第 2 步,那么几乎可以肯定 UIApplicationMain 有问题 - 它有可能不会返回,所以在其中的各个点放置 NSLog 语句(第 1.1 步、第 1.2 步……)并运行以查找记录的最后一条消息。
继续向下钻取(步骤 1.7.1、1.7.2、.... 1.7.6.3.2、...) - 最终,当日志消息将停止记录,该行将成为您的罪魁祸首(“关闭”日志记录或退出而不正常返回)。
我在网上找到的另一个 sn-p:
=====
当你使用这条线时:
int retVal = UIApplicationMain(argc, argv, @"MyApp", @"MyApp");
第一个 MyApp 是您的主要应用委托类。第二个是 SpringBoard 发送触摸通知的类。
另外,如果您使用的是 SDK,并且在 Info.plist 中定义了一个主 nib,那么您可以将调用保留为:
int retVal = UIApplicationMain(argc, argv, nil, nil);
当您创建 xib 时将涵盖所有内容。
=====
现在我对 iPhone 开发(特别是 xibs)的了解还不够,甚至不知道最后一点是什么意思(或者如果你设置正确的话),但这听起来像是编译的另一个阶段。
但是,我读到的第一个想法是,当按下按钮要求您做某事(例如优雅地关闭)时,Springboard 会调用您的委托类。如果它不能问你(即没有代表),它可能有权在它认为合适的时候关闭你,例如[UIApplication _terminateWithStatus:]。
在 Windows 世界中,您可能会向主窗口发送退出消息,但正如我所说,iPhone 开发可能会有所不同。
不过,这是一个调查的途径。如果您提供了一个,我很想看看对代表进行了哪些调用。上面的 sn-p 包含的代码是这样的:
@implementation MyApp
- (void) applicationDidFinishLaunching:(id)unused {
rect = [ UIHardware fullScreenApplicationContentRect ];
rect.origin.x = 0.0f;
rect.origin.y = 0.0f;
window = [ [ UIWindow alloc ] initWithContentRect: rect ];
[ window makeKeyAndVisible ];
view = [ [ MyAppView alloc ] initWithFrame: rect ];
[ window setContentView: view ];
}
- (void) dealloc {
[ window release ];
[ view release ];
[ super dealloc ];
}
所以也许dealloc() 的代表是让它退出到main() 的秘诀。你为什么不试一试?即使它不能解决核心问题,它也可能会让你更接近目标。