Ios alertView:didDismissWithButtonIndex:发送到解除分配实例的消息
问题只发生在iOS4.3上。我使用的是ARC,我的基本SDK是iOS6 在我的视图控制器的Ios alertView:didDismissWithButtonIndex:发送到解除分配实例的消息,ios,uialertview,ios4,Ios,Uialertview,Ios4,问题只发生在iOS4.3上。我使用的是ARC,我的基本SDK是iOS6 在我的视图控制器的-viewdide中,我检查这是否是第一次启动应用程序,如果是,则创建并显示UIAlertView。我将该UIAlertView分配给视图控制器上的strong属性,并将self设置为UIAlertView委托 self.uiAlertView = [[UIAlertView alloc] initWithTitle:@"Welcome!"
-viewdide
中,我检查这是否是第一次启动应用程序,如果是,则创建并显示UIAlertView。我将该UIAlertView分配给视图控制器上的strong
属性,并将self设置为UIAlertView委托
self.uiAlertView = [[UIAlertView alloc] initWithTitle:@"Welcome!"
message:messageString
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:@"View Tutorial Videos", @"Email Support", nil];
当我点击其中一个按钮时,应用程序崩溃,抱怨-alertView:diddismisswithbuttonnindex:
被发送到一个已解除分配的实例。委托是显示UIAlertView的视图控制器
在应用程序的所有后续启动中,如果未显示UIAlertView,则不会出现任何问题。视图控制器绝对没有被解除分配
如果我显示UIAlertView,但将委托设置为nil,则不会出现问题,应用程序将继续工作,因此显然视图控制器尚未解除分配,因为我可以继续使用它
发生了什么事?这只会导致iOS4.3出现问题
编辑:根据评论中的建议,我在不同的地方添加了更多的日志消息
我发现视图控制器正在解除锁定,但前提是该视图控制器显示UIAlertView。究竟是什么原因导致视图控制器仅仅因为将自身设置为UIAlertView的委托,然后显示它而被解除锁定
我的应用程序代理对视图控制器有一个strong
引用,因此我完全看不到视图控制器被解除锁定的原因
编辑2:我发现在启动期间,我的主视图控制器被实例化了两次。第一个是创建UIAlertView的,该视图正在被解除锁定。第二个是我后来能够与之交互的视图控制器,它使我认为视图控制器仍然存在并且可以操作 然而,我不知道我的视图控制器将在何处或为什么创建两次。我没有任何视图控制器的alloc/init语句。它只存在于主窗口_iPhone.xib中 第一次在我的视图控制器上调用viewDidLoad时,上面的堆栈帧是[UIViewController视图]。第二次在my view controller的第二个实例上调用viewDidLoad时,上面的堆栈帧是[UINib InstanceWithOwner:options:]
编辑3:我已经“修复”了这个问题,但我不明白为什么会发生这种情况。也许你能帮我理解 在我的主窗口_iPhone.xib中,我创建了我的根视图控制器,并将其分配给我的应用程序代理上的一个IBOutlet。相反,我从xib中删除了视图控制器,并在
-application:(UIApplication*)应用程序中的代码中创建了它。应用程序使用选项:(NSDictionary*)launchOptions完成了启动。。。问题消失了
为什么在xib中会创建两次视图控制器?我以前遇到过这个问题。alertView:didDismissWithButtonIndex:在alertView:ClickedButtonIndex:之后调用。您很可能通过执行类似于[self.navigationController PopViewControllerInitiated:YES]的操作来解除alertView:ClickedButtonIndex中视图控制器的分配
UIAlertView委托不是弱引用。当委托被解除分配时,它不会自动设置为nil。这就是您的代码崩溃的原因。我修复了此问题,对该方法进行了注释(或删除)
正如James Wang所说,didDismissWithButtonIndex是在ClickedButtonIndex之后调用的,因此我对其进行了注释以避免崩溃。您必须显示更多的代码,因为您所显示的问题似乎是,当您单击“确定”按钮时,无论自身是什么,都确实解决了,但如果我只是不显示UIAlertView,视图控制器工作正常,从未解除分配。如果我只是注释掉[self.uiAlertView show];打电话就行了。那么,是什么导致当前可见的视图控制器被释放呢。这没有道理。如果它只发生在iOS 4.3上,那可能是一个bug。让我们找一个解决办法。首先,尝试nslog并检查委托是否正确设置。uiAlertView分配后立即执行以下操作:nslog(@“This VC:%@-Alert delegate:%@”,self,self.uiAlertView.delegate)。显然,在结果中,self和alert委托应该具有相同的实例。如果不相同(例如:self.uiAlertView.delegate为零),请尝试直接重新设置:self.uiAlertView.delegate=self;和nslog再次当我在alloc/init之后记录委托时,它是正确的。我还设置了一个GCD调用,在3秒钟后再次记录。当我点击确定按钮之后,我得到了-[MyViewController alertView:didDismissWithButtonIndex:]:消息发送到解除分配的实例0x7b37600
错误。。错误中的类是正确的类。所以,它清楚地指向正确的内存位置,并且视图控制器在那里并且正在工作。。。但是当UIAlertView试图调用didDismissWithButtonIndex时,它认为它是dealloc'd。我在我的视图控制器上向dealloc添加了一条日志消息,它肯定会被调用。。。但只有当我显示UIAlertView时才会调用它。世界跆拳道联盟?显示UIAlertView如何导致显示视图控制器解除锁定?
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
NSLog(@"se apreto cancel");
}