首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择视图__cfrunloop_is_calling_out_to_a_source1_perform1_function上的随机崩溃didSelect:

选择视图__cfrunloop_is_calling_out_to_a_source1_perform1_function上的随机崩溃didSelect:
EN

Stack Overflow用户
提问于 2017-09-12 07:53:11
回答 1查看 723关注 0票数 0

我收到了下面的崩溃报告,但我不明白issue.Line 487指向检查委托中的pickerView是否是一个特定变量。

代码语言:javascript
复制
Crashed: com.apple.main-thread
0  App                    0x1001c5208 specialized NewCorrectiveVC.pickerView(UIPickerView, didSelectRow : Int, inComponent : Int) -> () (NewCorrectiveVC.swift:487)
1  App                    0x1001c2028 @objc NewCorrectiveVC.pickerView(UIPickerView, didSelectRow : Int, inComponent : Int) -> () (NewCorrectiveVC.swift)
2  UIKit                  0x197a83154 -[UIPickerView _sendSelectionChangedForComponent:notify:] + 116
3  UIKit                  0x197a8338c -[UIPickerView _sendSelectionChangedFromTable:notify:] + 344
4  UIKit                  0x197fb0424 -[UIPickerTableView _scrollingFinished] + 188
5  UIKit                  0x197fb05fc -[UIPickerTableView scrollViewDidEndDecelerating:] + 28
6  UIKit                  0x197b216ac -[UIScrollView(UIScrollViewInternal) _scrollViewDidEndDeceleratingForDelegate] + 132
7  UIKit                  0x1979b6db0 -[UIScrollView(UIScrollViewInternal) _stopScrollDecelerationNotify:] + 332
8  UIKit                  0x1979b68ec -[UIScrollView _smoothScrollWithUpdateTime:] + 2356
9  QuartzCore             0x194bc01bc CA::Display::DisplayLinkItem::dispatch(unsigned long long) + 44
10 QuartzCore             0x194bc0068 CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 444
11 IOKit                  0x191c27138 IODispatchCalloutFromCFMessage + 372
12 CoreFoundation         0x19195056c __CFMachPortPerform + 180
13 CoreFoundation         0x191968934 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 56
14 CoreFoundation         0x1919680e8 __CFRunLoopDoSource1 + 436
15 CoreFoundation         0x191965bcc __CFRunLoopRun + 1840
16 CoreFoundation         0x191894048 CFRunLoopRunSpecific + 444
17 GraphicsServices       0x19331a198 GSEventRunModal + 180
18 UIKit                  0x1978792fc -[UIApplication _run] + 684
19 UIKit                  0x197874034 UIApplicationMain + 208
20 App                    0x100173d04 main (AppDelegate.swift:22)
21 libdispatch.dylib      0x1908785b8 (Missing)

代码:

代码语言:javascript
复制
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
    if pickerView == assignedTo
    {
        if employees.count > 0 {
            selectedEmp =  employees[row].employeeId
        }
    }
    else if pickerView == category \\this is line 487
    {
        if categories.count > 0 {
            selectedCat = categories[row].wocategoryId
        }
    }
}

编辑:

不确定以下内容是否相关,但我确实有与我的pickerViews链接的观察者:

代码语言:javascript
复制
let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressed))
assignedTo.addGestureRecognizer(longPressRecognizer)
let catLongPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.catLongPressed))
category.addGestureRecognizer(catLongPressRecognizer)
self.hideKeyboardWhenTappedAround()
self.scroll.keyboardDismissMode = .interactive

FYI:

代码语言:javascript
复制
public func hideKeyboardWhenTappedAround() {
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
    view.addGestureRecognizer(tap)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-15 13:23:54

我怀疑问题在于打电话给==

代码语言:javascript
复制
if pickerView == assignedTo

这不是你真正的意思。这将强制调用==函数,并试图计算这两个对象之间的相等性。如果其中一个是nil,就会崩溃。

pickerView不应该是nil,但我遇到过UIKit向nil发送参数的情况,这些参数不应该是nil。(如果后台线程上有对UIKit方法的调用,则尤其可能发生这种情况。不要这么做,但也可能因为UIKit错误而发生。)

如果视图没有加载,assignedTo可以是nil。理论上,在这种情况下,您永远不应该得到这个调用,但同样,在存在but的情况下,这也是可能的,同样最常见的原因是在主线程上调用UIKit方法(任何UIKit方法;它并不总是与这个特定的选择器视图相关),但是UIKit有时也有自己的but。

无论如何,您并不意味着"is pickerView等于assignedTo“。你的意思是“pickerView和assignedTo完全一样吗?”那是===

代码语言:javascript
复制
if pickerView === assignedTo

===进行指针比较,所以即使面对无效的nil,也是安全的。

请记住,这几乎肯定与比赛条件有关。当您在调试器中运行它时,它并不容易再现,这并不意味着什么。它可能在10k的尝试中发生一次,仅在发布时,只在iPhone 6上发生。这就是种族条件的本质。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46170876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档