对象在 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 没有在屏幕上消失?