【发布时间】:2016-03-15 03:35:11
【问题描述】:
大家好,我已经调试这个问题很长一段时间了,但到目前为止还没有运气。我在这里很迷茫,不知道导致此崩溃的原因以及如何修复它。如果有人能在这方面给我一些帮助,我将非常感激,非常感谢!
我在GitHub here 准备了一个示例项目来演示该问题。
场景如下:
有两个视图控制器,分别是根视图和模态视图,每个都有一个自定义滚动视图(类即
SubScorllView)作为子视图,模态视图有一个关闭模态视图的按钮。滚动视图是UIScrollView的子类,每个子类都有对应的委托协议,类层次如下:
UIScrollView
∟ SuperScrollView
.....∟ SubScrollView
应用以非常简单的方式启动和运行,在 AppDelegate 的 didFinishLaunchingWithOptions 中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor blackColor];
RootViewController * rootVC = [[RootViewController alloc] init];
self.navVC = [[UINavigationController alloc] initWithRootViewController:rootVC];
self.navVC.navigationBarHidden = TRUE;
self.window.rootViewController = self.navVC;
[self.window makeKeyAndVisible];
ModalViewController *modalVC = [[ModalViewController alloc] init];
[self.navVC presentViewController:modalVC animated:YES completion:nil];
return YES;
}
并且视图是从 xib 文件中加载的,滚动视图的委托也在其中设置,并且对于滚动视图子类的启动和设置委托的方法有一些覆盖。
当我通过单击模态视图中的“关闭”按钮关闭模态视图时出现问题,当单击该按钮时,会发生以下情况:
- (IBAction)didPressedCloseButton:(id)sender {
self.subScrollView.delegate = nil;
[self dismissViewControllerAnimated:YES completion:nil];
}
应用程序在SuperScrollView 中的以下部分崩溃:
- (void)setDelegate:(id<SuperScrollViewDelegate>)delegate {
_superScrollViewDelegate = delegate;
// trigger UIScrollView to re-examine delegate for selectors it responds
super.delegate = nil;
super.delegate = self; // app crashes at this line
}
在控制台中出现以下错误消息:
objc[6745]: 无法形成对实例 (0x7fa803839000) 的弱引用 类子滚动视图。这个物体可能是 过度释放,或正在释放。
我不明白为什么应用程序会崩溃并给出上述错误消息,或者我应该如何修复它。我尝试使用错误消息进行搜索,但似乎该消息主要与文本视图等其他类有关,而其他一些则通过在解除分配之前将滚动视图的委托设置为 nil 来解决它,但它在我的情况下不起作用。
===========
更新:刚刚测试了这是否发生在带有模拟器的 iOS 8 上,它根本不会像在 iOS 9 上那样崩溃。
【问题讨论】:
-
这可能与在 iOS 9+/ OS X 10.11+ 中出现莫名其妙的行为变化有关,其中assigning an object undergoing deallocation to a weak variable crashes
标签: ios objective-c uiscrollview uiscrollviewdelegate