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

继续尝试,让我知道它是否有效。祝你好运!

+0

感谢您的回复。当cameraHelpView作为子视图添加到UIAlertView时,警报将保留cameraHelpView的副本,直到警报发布。这就是为什么在将它添加为子视图后释放cameraHelpView是安全的。 – Ian 2009-10-04 02:02:22

+0

糟糕!对于错误信息抱歉。 – 2009-10-04 05:17:29