views:

110

answers:

4

Hi, I created this awesome iPad game - clean and fun to play, and people that manage to play it more than once love it. In some cases, however, it will not launch for the second time.

I can't debug it since it works perfect on my iPad, simulator and on all my friend's iPads. One customer told me that it works on 32GB but not on 64GB iPads - could this be it?

Any help would be appreciated - this is sinking my ratings (and for a good reason, unfortunately)

Would love to give out promo code to anyone willing to look into this.

Thanks!! Hanaan

From My AppDelegate, if helps:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions     {    

self.playerName = [[NSUserDefaults standardUserDefaults] objectForKey:@"player_name"];
if(self.playerName == nil){
    self.playerName = @"nono";

    self.pref_currentPuzzleNumberHintsString = @"";
    self.pref_currentPuzzleFinishedSolutionString = @"";
    self.pref_currentPlayerMarksString = @"";
    self.pref_marksCompleteString = @"";
    self.pref_currentPuzzleId = -1;

    self.pref_gameInProgress = NO;
    self.pref_soundOn = YES;
    self.pref_buttonsOnLeft = NO;
    self.pref_gameTimerValue = 0;
    self.pref_gameSize = 0;

    NSNumber *pref_gameInProgress_temp = [NSNumber numberWithInt:0];
    NSNumber *pref_soundOn_temp = [NSNumber numberWithInt:1];
    NSNumber *pref_buttonsOnLeft_temp = [NSNumber numberWithInt:0];
    NSNumber *pref_gameNumber_temp = [NSNumber numberWithInt:self.pref_currentPuzzleId];
    NSNumber *pref_gameSize_temp = [NSNumber numberWithInt:self.pref_gameSize];
    NSNumber *pref_gameTimer_temp = [NSNumber numberWithInt:self.pref_gameTimerValue];


    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 

    [standardUserDefaults setObject:self.pref_currentPuzzleFinishedSolutionString forKey:@"game_string"];
    [standardUserDefaults setObject:self.pref_currentPuzzleNumberHintsString forKey:@"hint_string"];
    [standardUserDefaults setObject:self.pref_currentPlayerMarksString forKey:@"solution_string"];
    [standardUserDefaults setObject:self.pref_marksCompleteString forKey:@"marks_complete_string"];

    [standardUserDefaults setObject:pref_gameNumber_temp forKey:@"game_id"];
    [standardUserDefaults setObject:pref_gameSize_temp forKey:@"game_size"];
    [standardUserDefaults setObject:pref_gameTimer_temp forKey:@"game_timer_value"];

    [standardUserDefaults setObject:pref_gameInProgress_temp forKey:@"game_in_progress"];
    [standardUserDefaults setObject:pref_soundOn_temp forKey:@"sound_on"];
    [standardUserDefaults setObject:pref_buttonsOnLeft_temp forKey:@"buttons_on_left"];

    [standardUserDefaults setObject:self.playerName forKey:@"player_name"];

    [[NSUserDefaults standardUserDefaults] synchronize];

    [pref_gameInProgress_temp release];
    [pref_gameSize_temp release];
    [pref_soundOn_temp release];
    [pref_gameTimer_temp release];
    [pref_gameNumber_temp release];
    [pref_buttonsOnLeft_temp release];

}else {
    self.pref_currentPlayerMarksString = [[NSUserDefaults standardUserDefaults] objectForKey:@"game_string"];
    self.pref_currentPuzzleNumberHintsString = [[NSUserDefaults standardUserDefaults] objectForKey:@"hint_string"];
    self.pref_currentPuzzleFinishedSolutionString = [[NSUserDefaults standardUserDefaults] objectForKey:@"solution_string"];
    self.pref_marksCompleteString = [[NSUserDefaults standardUserDefaults] objectForKey:@"marks_complete_string"];

    self.pref_currentPuzzleId = [[[NSUserDefaults standardUserDefaults] objectForKey:@"game_id"]intValue];

    self.pref_gameSize = [[[NSUserDefaults standardUserDefaults] objectForKey:@"game_size"]intValue];
    self.pref_gameTimerValue = [[[NSUserDefaults standardUserDefaults] objectForKey:@"game_timer_value"]intValue];

    int pref_gameInProgress_temp = [[[NSUserDefaults standardUserDefaults] objectForKey:@"game_in_progress"]intValue];
    self.pref_gameInProgress = (pref_gameInProgress_temp == 1);

    int pref_soundOn_temp = [[[NSUserDefaults standardUserDefaults] objectForKey:@"sound_on"]intValue];
    self.pref_soundOn = (pref_soundOn_temp == 1);

    int pref_buttonsOnLeft_temp = [[[NSUserDefaults standardUserDefaults] objectForKey:@"buttons_on_left"]intValue];
    self.pref_buttonsOnLeft = (pref_buttonsOnLeft_temp == 1);
    //NSLog(@"Saved game: %@",self.pref_currentPlayerMarksString);
}   


// Add the view controller's view to the window and display.
[window addSubview:viewController.view];
[window makeKeyAndVisible];

return YES;
}

The log I got from a customer has this:

--

Incident Identifier: 1581089C-C02A-4155-9493-9E42B9AAB37D
CrashReporter Key:   a913e5f82c7112b47b354f04909239bff1b39000
Hardware Model:      iPad1,1
Process:         Nonograms [193]
Path:            /var/mobile/Applications/4F03245E-CFB8-4181-B881-859FDAEE18C7/Nonograms.app/Nonograms
Identifier:      Nonograms
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2010-08-21 16:31:11.002 +0200
OS Version:      iPhone OS 3.2.2 (7B500)
Report Version:  104

SYMBOLIZED:

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Thread 0 Crashed:
0   libSystem.B.dylib               0x000790a0 __kill + 8
1   libSystem.B.dylib               0x00079090 kill + 4
2   libSystem.B.dylib               0x00079082 raise + 10
3   libSystem.B.dylib               0x0008d20a abort + 50
4   libstdc++.6.dylib               0x00044a1c __gnu_cxx::__verbose_terminate_handler() + 376
5   libobjc.A.dylib                 0x000057c4 _objc_terminate + 104
6   libstdc++.6.dylib               0x00042dee __cxxabiv1::__terminate(void (*)()) + 46
7   libstdc++.6.dylib               0x00042e42 std::terminate() + 10
8   libstdc++.6.dylib               0x00042f12 __cxa_throw + 78
9   libobjc.A.dylib                 0x000046a4 objc_exception_throw + 64
10  CoreFoundation                  0x00094174 -[NSObject doesNotRecognizeSelector:] + 108
11  CoreFoundation                  0x00093afa ___forwarding___ + 482
12  CoreFoundation                  0x000306c8 _CF_forwarding_prep_0 + 40
13  Nonograms                       0x00003238 0x1000 + 8760
14  UIKit                           0x00003e58 -[UIApplication _performInitializationWithURL:payload:] + 336
15  UIKit                           0x00003b22 -[UIApplication _runWithURL:payload:launchOrientation:] + 394
16  UIKit                           0x0004f8c4 -[UIApplication handleEvent:withNewEvent:] + 1336
17  UIKit                           0x0004f242 -[UIApplication sendEvent:] + 38
18  UIKit                           0x0004ec8c _UIApplicationHandleEvent + 4772
19  GraphicsServices                0x00003b2c PurpleEventCallback + 660
20  CoreFoundation                  0x00022d96 CFRunLoopRunSpecific + 2214
21  CoreFoundation                  0x000224da CFRunLoopRunInMode + 42
22  UIKit                           0x0000340a -[UIApplication _run] + 342
23  UIKit                           0x00001954 UIApplicationMain + 636
24  Nonograms                       0x00002538 0x1000 + 5432
25  Nonograms                       0x00002508 0x1000 + 5384
A: 

I dont know the specifics of the iPad and obj-c development. However, this looks like memory corruption and/or dangling pointers in some way.

For example, you could be modifying an array beyond its bounds. Double check all your loops and add debug asserts that verify the bounds.

Another possibility is that you could be using pointers to objects that have been deleted, and writing/interpreting this memory has undefined effects. Usually it just crashes.

Or you could have uninitialized pointers.

All of this falls into the category that I like to call The Insanity of Developing Applications in C/C++/etc. Unchecked buffer bounds, manual memory deallocation, and unguarded call stack memory are just nutty ideas w/r to modern application development.

Magnus Wolffelt
Mangus - The odd thing is that the app works great on most iPads.Only some crash, but they all display the same pattern:1st launch successful, play the game, have a blast2nd launch and after, immediate crash :-(
Hanaan Rosenthal
+1  A: 

You need to find the line of code that frame 13 of your stack trace represents.

I would hope that you used the "Build and Archive" feature of the recent versions of Xcode. In this case, all you would need to do is drag and drop the crash log to the Xcode Organizer. This will "symbolicate" the crash log, meaning that it will convert the addresses to classes and methods.

Once you know the line that caused the error it will (hopefully) be relatively simple to figure out what went wrong. My guess would be memory corruption of some description -- a value you assumed you saved on the first run isn't there or something.

Stephen Darlington
Stephan - I changed the post to the symbolized version - please take a look.Thanks!Hanaan
Hanaan Rosenthal
Looks like it didn't symbolicate correctly. You can see what's going on inside the OS but not inside Nonograms. Your code is calling a non-existent selector (method). Can't tell for sure which method but I'd guess it's in the app delegate, somewhere in your startup sequence.
Stephen Darlington
Yea, I see - the answer I am looking for is: 13 Nonograms 0x00003238 0x1000 + 8760Any idea how I get this line deciphered?
Hanaan Rosenthal
A: 

I think some object or UI element of yours is getting released (deallocated), but you expect it to still exist:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/51235-crash-log-help.html

Magnus Wolffelt
A: 

The problem was releasing unowned objects...

[pref_gameInProgress_temp release];
[pref_gameSize_temp release];
[pref_soundOn_temp release];
[pref_gameTimer_temp release];
[pref_gameNumber_temp release];
[pref_buttonsOnLeft_temp release];
Hanaan Rosenthal