Cocoa touch 当显示UIPopoverController时,iPad ARC应用程序崩溃
当popover仍然可见时,我收到了(显然是常见的)错误Cocoa touch 当显示UIPopoverController时,iPad ARC应用程序崩溃,cocoa-touch,automatic-ref-counting,uipopovercontroller,Cocoa Touch,Automatic Ref Counting,Uipopovercontroller,当popover仍然可见时,我收到了(显然是常见的)错误[UIPopoOvercontroller dealloc]。当我尝试在我的iPad应用程序中显示popover控制器时 这里有很多问题,但我的问题似乎不同。首先,我通过父视图控制器上的属性维护对popover控制器的强引用: @property (strong, nonatomic) UIPopoverController* passcodePopover; 下面是我的代码,它实际显示了popover(注意,我使用的是第三方): 现在奇
[UIPopoOvercontroller dealloc]。当我尝试在我的iPad应用程序中显示popover控制器时
这里有很多问题,但我的问题似乎不同。首先,我通过父视图控制器上的属性维护对popover控制器的强引用:
@property (strong, nonatomic) UIPopoverController* passcodePopover;
下面是我的代码,它实际显示了popover(注意,我使用的是第三方):
现在奇怪的是,它似乎在调用设置属性时崩溃,正如在这个堆栈跟踪片段中所看到的:
0 CoreFoundation 0x01d2802e __exceptionPreprocess + 206
1 libobjc.A.dylib 0x01165e7e objc_exception_throw + 44
2 CoreFoundation 0x01d27deb +[NSException raise:format:] + 139
3 UIKit 0x00573bf2 -[UIPopoverController dealloc] + 86
4 libobjc.A.dylib 0x011799ff -[NSObject release] + 47
5 libobjc.A.dylib 0x011780d5 objc_release + 69
6 libobjc.A.dylib 0x01178fda objc_storeStrong + 39
7 Kiosk 0x00047d59 -[SplashViewController setPasscodePopover:] + 57
8 Kiosk 0x00047ad2 -[SplashViewController adminConfig:] + 802
...
然而,popover在应用程序崩溃之前立即出现在模拟器中,因此它显然已经超越了当前的调用。显然还有其他一些对setpasscodepover:
的隐式调用发生在某处
如果它提供了任何细节,则上述方法将由手势识别器触发。self。当您为其分配uipc
时,passcodepover
不是零。它已经指向屏幕上的popover控制器。当您将uipc
分配给self.passcodepover
时,将释放旧的poover控制器,然后在其视图仍然可见时解除分配
你需要弄清楚什么时候你想扔掉旧的popover。您可以在重新分配之前简单地将其取消:
[self.passcodePopover dismissPopoverAnimated:YES];
self.passcodePopover = uipc;
请注意,将dismissPopoverAnimated:
发送到nil(它没有效果)是安全的,因此您甚至不必首先检查它。是否可能在分配uipc
时,self.passcodePopover
尚未为nil?它实际上是指一个仍然可见的popover控制器?在方法中的self.passcodePopover=uipc
之前放置NSLog(“旧的popover控制器=%@”,self.passcodePopover)
,或者用断点检查它。啊哈!我想你找到了一些东西。正如我所预料的,self.passcodepover第一次是空的。但显然我的方法被调用了不止一次!可能是手势识别器。我想你已经解决了在我的例子中,手势识别器只是连续两次调用该方法,所以我不需要忽略前一个方法。我所需要的只是检查它是否已经设置好了,如果已经设置好了,就返回。
[self.passcodePopover dismissPopoverAnimated:YES];
self.passcodePopover = uipc;