Cocoa touch 当显示UIPopoverController时,iPad ARC应用程序崩溃

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(注意,我使用的是第三方): 现在奇

当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;