Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios alertView:didDismissWithButtonIndex:发送到解除分配实例的消息_Ios_Uialertview_Ios4 - Fatal编程技术网

Ios alertView:didDismissWithButtonIndex:发送到解除分配实例的消息

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!"

问题只发生在iOS4.3上。我使用的是ARC,我的基本SDK是iOS6

在我的视图控制器的
-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");
}