当视频控制器被解除时,大约1%的用户遇到崩溃。我自己无法重现它,但Crashlytics正在给我堆栈中的崩溃代码。从统计数据来看,问题似乎与某个操作系统版本或某种设备类型无关。
以下是相关的代码段。
在LoginViewController.m
的某个地方,我有
if (someCondition) {
PinViewController* pinViewController = [[PinViewController alloc] initWithSecret:secret target:self andLoginSuccessfulSelector:@selector(notifyAboutLoginAsync:)];
[self presentViewController:pinViewController animated:YES completion:nil];
} else {
[self performSelector:@selector(notifyAboutLoginAsync:) withObject:nil afterDelay:0.01];
}
notifyAboutLoginAsync:
看起来像这样:
- (void)notifyAboutLoginAsync:(id)data {
[self dismissViewControllerAnimated:YES completion:nil]; // crash happens on this line!
}
在上面的代码中,我将notifyAboutLoginAsync:
选择器传递给PinViewController
的{{1}}方法,以便我可以在init
中使用它:< / p>
PinViewController
然后在@property (readwrite) SEL loginSuccessfulSelector;
- (id)initWithSecret:(NSString *)pSecret target:(id)sTarget andLoginSuccessfulSelector:(SEL)successfulSelector {
...
self.loginSuccessfulSelector = successfulSelector;
...
}
我也有
PinViewController
崩溃发生在- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
if (successful) {
[[self target] performSelectorOnMainThread:[self loginSuccessfulSelector] withObject:[self pin] waitUntilDone:false];
}
}
方法中。
我的猜测是,当我调用notifyAboutLoginAsync:
时,LoginViewController可能已被解除,但我无法验证它,因为我无法自行复制它。我的猜测可能是原因吗?如果是这样,有没有办法检查我的控制器是否已被解雇,然后再致电dismissViewControllerAnimated:
?
在末尾附加崩溃痕迹。
dismissViewControllerAnimated: