[__NSCFTimer copyWithZone:]: unrecognized selector sent to instance

天大地大妈咪最大 提交于 2019-12-09 01:54:37

问题


    var searchDelayer:NSTimer?
    func searchBar(searchBar: UISearchBar!, textDidChange searchText: String!) {
        searchDelayer?.invalidate()
        searchDelayer = nil

        searchDelayer = NSTimer.scheduledTimerWithTimeInterval(1.5, target: self, selector: Selector("doDelayedSearch:"), userInfo: searchText, repeats: false)

    }

    func doDelayedSearch(text:String){
    ...
    }

Why this code crashes with error message:

[__NSCFTimer copyWithZone:]: unrecognized selector sent to instance

Updated:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFTimer copyWithZone:]: unrecognized selector sent to instance 0x7f9c622ae7e0'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010c05b3e5 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010ba42967 objc_exception_throw + 45
    2   CoreFoundation                      0x000000010c0624fd -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010bfba7ec ___forwarding___ + 988
    4   CoreFoundation                      0x000000010bfba388 _CF_forwarding_prep_0 + 120
    5   CoreFoundation                      0x000000010bf32935 CFStringCreateCopy + 229
    6   libswiftFoundation.dylib            0x000000010dc41314 _TF10Foundation24_convertNSStringToStringFCSo8NSStringSS + 116
    7   MapCode                             0x000000010a1a567e _TToFC7MapCode17MapViewController15doDelayedSearchfS0_FSST_ + 62
    8   Foundation                          0x000000010b5fce94 __NSFireTimer + 83
    9   CoreFoundation                      0x000000010bfc34d4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
    10  CoreFoundation                      0x000000010bfc3095 __CFRunLoopDoTimer + 1045
    11  CoreFoundation                      0x000000010bf863cd __CFRunLoopRun + 1901
    12  CoreFoundation                      0x000000010bf859f6 CFRunLoopRunSpecific + 470
    13  GraphicsServices                    0x000000010ecfd9f0 GSEventRunModal + 161
    14  UIKit                               0x000000010c96b990 UIApplicationMain + 1282
    15  MapCode                             0x000000010a1b3fee top_level_code + 78
    16  MapCode                             0x000000010a1b402a main + 42
    17  libdyld.dylib                       0x000000010f9d7145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

回答1:


The timer callback function must be either a function without arguments, or a function taking a NSTimer as a single argument.

In your case, it should be

func doDelayedSearch(timer: NSTimer) {
    let searchText = timer.userInfo as String
    // ...
}

Old answer: (The following is correct but does not apply here)

The target of the timer (self in your case) needs to be compatible with Objective-C, i.e. derived from NSObject or marked with @objc.

See also Exposing Swift Interfaces in Objective-C in the "Using Swift with Cocoa and Objective-C" documentation (emphasis mine):

The @objc attribute makes your Swift API available in Objective-C and the Objective-C runtime. In other words, you can use the @objc attribute before any Swift method, property, subscript, initializer, or class that you want to use from Objective-C code. If your class inherits from an Objective-C class, the compiler inserts the attribute for you.
...
This attribute is also useful when you’re working with Objective-C classes that use selectors to implement the target-action design pattern—for example, NSTimer or UIButton.



来源:https://stackoverflow.com/questions/25461215/nscftimer-copywithzone-unrecognized-selector-sent-to-instance

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!