Why doesn't an iPhone app's main() function ever get a chance to finish?

前端 未结 3 1673
长发绾君心
长发绾君心 2021-02-15 03:07

Consider the following main() method which you would find most iPhone applications:

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool =         


        
3条回答
  •  滥情空心
    2021-02-15 03:26

    Try:

    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;
    }
    

    It may be that the release of the pool is preventing further logging in which case you'd get step 2 but not step 3.

    If step 2 isn't being printed, then it's almost certainly something wrong with UIApplicationMain - there's a chance that it doesn't return so put NSLog statements (step 1.1, Step 1.2, ...) at various points within it and run to find the last message logged.

    Keep drilling down (Step 1.7.1, 1.7.2, .... 1.7.6.3.2, ...) - eventually, you'll track down the exact line (however deep in the call hierarchy) when the log messages stop being logged and that line will be your culprit (either "turning off" logging or exiting without returning normally).

    One further snippet I found on the web:

    =====

    When you use this line:

    int retVal = UIApplicationMain(argc, argv, @"MyApp", @"MyApp");
    

    The first MyApp is your main app delegate class. The second is the class to where SpringBoard sends touch notifications.

    Also, if you are using the SDK, and have a main nib defined in the Info.plist, then you can leave the call as:

    int retVal = UIApplicationMain(argc, argv, nil, nil);
    

    as all that will be covered when you create your xibs.

    =====

    Now I don't know enough about iPhone development (specifically xibs) to know what that last bit even means (or if you've set it up correctly) but it sounds like another phase of compilation.

    However, my first thought from reading that is that Springboard will call your delegate class when the buttons are pressed to ask you to do something (like shut down gracefully). If it can't ask you (i.e., no delegate), it's probably within its rights to shut you down as it sees fit, such as with [UIApplication _terminateWithStatus:].

    In the Windows world, you would probably send off a quit message to the main window but, as I say, iPhone development may be different.

    Still, it's an avenue to investigate. I'd be interested in seeing what calls were made to a delegate if you provided one. The code included with the snippet above had this:

    @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 ];
    }
    

    So maybe a delegate with dealloc() is the secret to getting it to exit back to main(). Why don't you give that a shot? It may get you closer to your goal even if it doesn't solve the core problem.

提交回复
热议问题