分配和解雇UIAlert w / spinner动画:有时崩溃,做错了吗?

时间:2010-03-07 20:28:13

标签: iphone uialertview

我正在创建一个带有微调器图形的警告对话框。

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

然后它被解雇了这样:

[alert dismissWithClickedButtonIndex:0 animated:YES];

偶尔会导致崩溃:

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]

和跟踪:

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

有一件好奇的事情是从GameKit引用GKPeerPicker;我没有在任何地方使用它(我正在使用GameKit的GKSession,但我没有使用GKPeerPicker组件)。

2 个答案:

答案 0 :(得分:0)

查看UIAlertView的文档后:

alert = ... message:nil ...

文档中没有提到nil允许的内容:

  

消息
  提供比标题更多详细信息的描述性文本。

虽然

  

cancelButtonTitle
  取消按钮的标题或nil如果没有取消按钮。

所以试试一个空字符串。

答案 1 :(得分:0)

一个可能的问题是,你有一个你不拥有的alert存储的引用!

试试这个:

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