views:

559

answers:

2

I'm creating an alert dialog with a spinner graphic.

UIAlertView *alert; //(at top of controller)

alert = [[[UIAlertView alloc] initWithTitle:@"Looking for someone to connnect to via WiFi" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease];
[alert show];

UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.center = CGPointMake(alert.bounds.size.width / 2, alert.bounds.size.height - 50);

[indicator startAnimating];
[alert addSubview:indicator];
[indicator release];

And then it is later dismissed like this:

[alert dismissWithClickedButtonIndex:0 animated:YES];

This occasionally results in a crash:

Sun Mar  7 12:01:29 unknown com.apple.SpringBoard[24] <Notice>: CoreAnimation: timed out fence 500
Sun Mar  7 12:01:29 unknown ReportCrash[1615] <Notice>: Formulating crash report for process someApp[1614]

and the trace:

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

Thread 0 Crashed:
0   libSystem.B.dylib               0x00090b2c __kill + 8
1   libSystem.B.dylib               0x00090b1a kill + 4
2   libSystem.B.dylib               0x00090b0e raise + 10
3   libSystem.B.dylib               0x000a7e34 abort + 36
4   libstdc++.6.dylib               0x00066390 __gnu_cxx::__verbose_terminate_handler() + 588
5   libobjc.A.dylib                 0x00008898 _objc_terminate + 160
6   libstdc++.6.dylib               0x00063a84 __cxxabiv1::__terminate(void (*)()) + 76
7   libstdc++.6.dylib               0x00063afc std::terminate() + 16
8   libstdc++.6.dylib               0x00063c24 __cxa_throw + 100
9   libobjc.A.dylib                 0x00006e54 objc_exception_throw + 104
10  CoreFoundation                  0x00026b2c +[NSException raise:format:arguments:] + 76
11  CoreFoundation                  0x00026acc +[NSException raise:format:] + 24
12  GameKit                         0x00025a50 -[GKPeerPickerViewController _shouldShowConnectTypeView] + 124
13  GameKit                         0x00026200 -[GKPeerPickerViewController loadInitialView] + 76
14  GameKit                         0x000262a4 -[GKPeerPickerViewController loadView] + 108
15  UIKit                           0x00069750 -[UIViewController view] + 44
16  GameKit                         0x000263fc -[GKPeerPickerViewController show] + 204
17  GameKit                         0x00023fbc -[GKPeerPickerController show] + 80
18  someApp                         0x00002a0c -[someAppViewController btnConnect:] (someAppViewController.m:43)
19  CoreFoundation                  0x00059888 -[NSObject performSelector:withObject:withObject:] + 20
20  UIKit                           0x0005b77c -[UIApplication sendAction:to:from:forEvent:] + 128
21  UIKit                           0x0005b6e4 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 32
22  UIKit                           0x0005b6ac -[UIControl sendAction:to:forEvent:] + 44
23  UIKit                           0x0005b304 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 528
24  UIKit                           0x0005bf84 -[UIControl touchesEnded:withEvent:] + 452
25  UIKit                           0x0005a8f8 -[UIWindow _sendTouchesForEvent:] + 520
26  UIKit                           0x00059f8c -[UIWindow sendEvent:] + 108
27  UIKit                           0x00055788 -[UIApplication sendEvent:] + 400
28  UIKit                           0x0005508c _UIApplicationHandleEvent + 4528
29  GraphicsServices                0x000057dc PurpleEventCallback + 1044
30  CoreFoundation                  0x00057524 CFRunLoopRunSpecific + 2296
31  CoreFoundation                  0x00056c18 CFRunLoopRunInMode + 44
32  GraphicsServices                0x000041c0 GSEventRunModal + 188
33  UIKit                           0x00003c28 -[UIApplication _run] + 552
34  UIKit                           0x00002228 UIApplicationMain + 960
35  someApp                         0x0000266e main (main.m:14)
36  someApp                         0x00002604 start + 44

One thing that's curious is the reference to GKPeerPicker, from GameKit; I'm not using it anywhere (I'm using GameKit's GKSession, but I'm not using the GKPeerPicker component).

A: 

After checking out the documentation of UIAlertView:

alert = ... message:nil ...

The documentation says nothing about a nil allowed:

message
Descriptive text that provides more details than the title.

While

cancelButtonTitle
The title of the cancel button or nil if there is no cancel button.

So try an empty string.

Pindatjuh
`nil` is allowed in this instance.
rpetrich
A: 

A possible problem is that you have a reference stored in alert that you do not own!

Try this:

- (void)hideAlert {
    [alert dismissWithClickedButtonIndex:0 animated:YES];
    [alert release];
    alert = nil;
}

- (void)showAlert {
    if (alert)
        return;
    alert = [[UIAlertView alloc] initWithTitle:@"Looking for someone to connnect to via WiFi" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil];
    [alert show];

    UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    indicator.center = CGPointMake(alert.bounds.size.width * 0.5f, alert.bounds.size.height * 0.5f);

    [indicator startAnimating];
    [alert addSubview:indicator];
    [indicator release];
}

- (void)dealloc {
    [alert dismissWithClickedButtonIndex:0 animated:YES];
    [alert release];
    [super dealloc];
}
rpetrich
That looks like it was the problem, rpetrich -- thank you!I switched to an empty string just to be safe, Pindatjuh -- thanks for that as well.
Michael F
I found another issue with this: adding the spinner too quickly after allocating the UIAlertView can sometimes cause the alert's bounds to read as "0,0" in CGPointMake. This makes the spinner show up in the wrong place (above and to the left of the alert window). I just set a timer to 0.2 and called that instead, so the spinner is added just a fraction of a second after the UIAlertView is created. This feels a bit sloppy... there's probably an event I should use instead.
Michael F