【发布时间】:2015-08-19 17:10:54
【问题描述】:
我在 UIScrollView 中看到了崩溃,因为在 scrollView 完成动画之前委托已从内存中释放。
我知道这是原因,解决方案应该是在 UIScrollView 的委托遇到自己的 dealloc 调用时手动取消委托。我已经对我能找到的每个具有 UIScrollView 子视图的 viewController 执行了此操作,但崩溃仍然存在。我知道根本原因是 UIScrollView 的委托是分配而不是弱,我很好奇我是否可以以某种方式覆盖它(通过类别?)。
还有其他解决方案吗?
这是崩溃的转储,我觉得奇怪的是堆栈上的调用之一引用了 UITextView(它继承自 UIScrollView),这是否可以提供有关有问题的 UIScrollView 位置的线索?
Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0xc1a9e521
0 libobjc.A.dylib objc_msgSend + 5 respondsToSelector:
1 UIKit -[UIScrollView(UIScrollViewInternal) _delegateScrollViewAnimationEnded] + 52
2 UIKit -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded:finished:] + 184
3 UIKit -[UITextView _scrollViewAnimationEnded:finished:] + 306
4 UIKit -[UIAnimator stopAnimation:] + 476
5 UIKit -[UIAnimator(Static) _advanceAnimationsOfType:withTimestamp:] + 304
6 UIKit -[UIAnimator(Static) _LCDHeartbeatCallback:] + 52
7 QuartzCore CA::Display::DisplayLinkItem::dispatch() + 98
8 QuartzCore CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 366
9 IOMobileFramebuffer IOMobileFramebufferVsyncNotifyFunc + 90
10 IOKit IODispatchCalloutFromCFMessage + 256
11 CoreFoundation __CFMachPortPerform + 132
18 UIKit UIApplicationMain + 1440
【问题讨论】:
-
当对象即将释放时设置 scrollView.delegate = nil
-
是的,我对每个我能想到的包含滚动视图的委托对象都这样做了,但崩溃仍然存在。有没有办法识别它是哪个对象?我无法在 sim 中重现这一点,所以必须依靠设备崩溃。
-
@JimmyXu 你得到解决方案了吗?
-
@meteors 是的,看起来我们错过了一些 UIScrollView 子类,这些子类也需要在 dealloc 上将其代表设置为 nil。具体是 UITextView。
标签: ios objective-c uiscrollview