对象在 UIAlertView 委托被调用之前被释放

Posted

技术标签:

【中文标题】对象在 UIAlertView 委托被调用之前被释放【英文标题】:Object gets dealloc'd before UIAlertView Delegate gets called 【发布时间】:2011-11-22 19:58:24 【问题描述】:

我在导航堆栈上有两个视图控制器。在第一个视图控制器中,我有一个方法可以显示一个警报,让您访问网站并离开应用程序。如果他们单击“否”,则不会发生任何事情,如果“是”,则会打开链接。这一切都有效。我现在的问题是,如果我想从导航堆栈上的第二个视图控制器调用此方法,我的第一个视图控制器会被释放,而委托永远不会被调用。这是正在发生的事情的一些伪代码。

在 SecondViewcontroller 中:

- (void)TargetSelectionPressed:(NSNotification *)notification 

    FirstViewController *dummyCtlr = nil;
    BOOL shouldPushToFistCtlr = NO;

    NSArray *controllers = [[NSArray alloc] initWithArray:[self.navigationController viewControllers]];

    for (UIViewController *ctlr in controllers) 
        if ([ctlr isKindOfClass:[FirstViewController class]]) 
            dummyCtlr = (FirstViewController *)ctlr;
            break;
        
    
    if (dummyCtlr == nil) 
        FirstViewController *gtc = [[[FirstViewController alloc] init] autorelease];
        dummyCtlr = gtc;
        shouldPushToFistCtlr = YES;
    

    switch (targetSelection) 
        case TARGET_LOCATION:
            break;
        case TARGET_CONDITION: 
            if (shouldPushToGTC) 
                [self.navigationController pushViewController:dummyCtlr animated:YES];
              
            else 
                [self.navigationController popToViewController:dummyCtlr animated:YES];
            
            break;
        
        case TARGET_LINK: 
            [dummyCtlr BuildURL:link];
            break;
        
        default:
            break;
    
    [controllers release];

第一视图控制器

- (void)BuildURL:(NSString* )link 
    self.ExternalLink = link;     NSString *message = [[NSString alloc] initWithFormat:@"Would you like to open %@ in Safari?", link];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Open Safari" message:message delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil];
    [alert show];
    self.SafariAlertView = alert;
    self.SafariAlertView.delegate = self;
    [alert release];
    [message release];


- (void)dealloc 
    [safariAlertView release];
    self.SafariAlertView.delegate = nil;
    [super dealloc];

【问题讨论】:

【参考方案1】:

检查*dummyCtlr 是否为nil 而不是dummyCtlr 是否为nil

【讨论】:

【参考方案2】:

我发现如果我为 dummyCtlr 创建一个属性,该对象将停留足够长的时间以调用 delgate。

【讨论】:

以上是关于对象在 UIAlertView 委托被调用之前被释放的主要内容,如果未能解决你的问题,请参考以下文章

UITextView 类中未调用 UIAlertView 委托方法

在 UI 自动化测试中解除警报时未调用 UIAlertView 的委托方法“clickedButtonAtIndex”

在委托中显示 UIAlertView 失败

为啥在我的视图被推送到导航堆栈之前我的 UIAlertView 没有在屏幕上消失?

在实例化单元格之前调用 UICollectionView 委托方法?

以编程方式在索引处调用UIAlertView clickedbutton