UIAlertView中导致崩溃在Release模式
问题描述:
如果帮助选项在我的应用程序启动的时候,用户进入到相机,我首先显示一个UIAlertView中关于如何拍摄照片提示:UIAlertView中导致崩溃在Release模式
-(void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex != [actionSheet cancelButtonIndex]) {
NSString *selectedButtonTitle = [actionSheet buttonTitleAtIndex:buttonIndex];
if ([selectedButtonTitle isEqualToString:@"Camera"]) {
// If Help is activated display camera tips
if (helpEnabled == YES) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Camera Tips" message:@"\n\n\n\n\n\n\n\n\n\n\n\n" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Go To Camera"];
UIImageView *cameraHelpView = [[UIImageView alloc] initWithFrame:CGRectMake(17, 40, 250, 255)];
UIImage *cameraTutorial = [UIImage imageNamed:@"Camera_Tips.png"];
cameraHelpView.image = cameraTutorial;
[alert addSubview:cameraHelpView];
[cameraHelpView release];
[alert show];
[alert release];
}
}
}
这个工程在调试模式,但在释放模式下会导致“EXC BAD ACCESS”错误。我可以从这个角度以模态方式呈现一个新的视图控制器,但是UIAlertView总是会使应用程序崩溃。为什么?
答
我发现我的错误。我没有通过零作为otherButtonTitles的最后一个参数!调试模式必须为您查看并修复此错误。希望这可以帮助某人。
答
我不知道它为什么在调试模式下工作,但它看起来像你正在释放你的cameraHelpView
,而它仍然被使用。在alert
的子视图中是指向cameraHelpView
的指针;当你释放它时,它不能再被访问。我建议用-[NSObject autorelease]
替换您在本文中调用的所有-[NSObject release]
。因此:
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Camera Tips" message:@"\n\n\n\n\n\n\n\n\n\n\n\n" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Go To Camera"] autorelease];
UIImage *cameraTutorial = [UIImage imageNamed:@"Camera_Tips.png"];
UIImageView *cameraHelpView = [[[UIImageView alloc] initWithFrame:CGRectMake(17, 40, 250, 255)] autorelease];
cameraHelpView.image = cameraTutorial;
[alert addSubview:cameraHelpView];
[alert show];
继续尝试,让我知道它是否有效。祝你好运!
感谢您的回复。当cameraHelpView作为子视图添加到UIAlertView时,警报将保留cameraHelpView的副本,直到警报发布。这就是为什么在将它添加为子视图后释放cameraHelpView是安全的。 – Ian 2009-10-04 02:02:22
糟糕!对于错误信息抱歉。 – 2009-10-04 05:17:29