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 0x开发者_运维知识库0005508c _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 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];
}
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 ornil
if there is no cancel button.
So try an empty string.
精彩评论