初始化UISearchBar时遇到 [UIView setImage:]: unrecognized selector sent to instance 崩溃
一、发现问题
在项目中想添加一个UISearchBar ,我本来以为so easy ,啪啪三下五除二,敲完代码后,满心欢喜的运行了程序,没有想到,程序崩了。报错如下:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView setImage:]: unrecognized selector sent to instance 0x1058194b0'
*** First throw call stack:
(0x1ba3ebef8 0x1b95b9a40 0x1ba303154 0x1e716e034 0x1ba3f1810 0x1ba3f34bc 0x1e71c8808 0x1e71c89c8 0x1e71bbeec 0x1e71c8794 0x1e71c47b0 0x102d87c30 0x1e747de4c 0x1e707f750 0x1e707fa58 0x1e70809e8 0x1e7081ce8 0x1e7013e30 0x1e7469998 0x1be9cda34 0x1be9d29c4 0x1be9319d4 0x1be9602f4 0x1be96115c 0x1ba379b94 0x1ba374828 0x1ba374dc8 0x1ba3745b8 0x1bc5e8584 0x1e6dbb558 0x102d88d50 0x1b9e34b94)
libc++abi.dylib: terminating with uncaught exception of type NSException
我去,我一看[UIView setImage:]无法识别?我仔细看了一下我初始化的代码发现也并没有用到这个方法呀,于是开始排查问题。
二、问题排查
我以前有遇到过 unrecognized selector sent to 这种类型的报错,可能是对象提前释放,然后我仔细排查了一下,发现我并没有弱引用。然后我去检查看一下崩溃日志,然后发现
Triggered by Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x00000001b9f819fc __ulock_wait + 8
1 libsystem_platform.dylib 0x00000001b9ff58f8 _os_unfair_lock_lock_slow + 172
2 libobjc.A.dylib 0x00000001b95c4868 lookUpImpOrForward + 136
3 libobjc.A.dylib 0x00000001b95d1098 _objc_msgSend_uncached + 56
4 UIKitCore 0x00000001e783d9f8 -[__UITextTiledLayer setBounds:] + 88
5 UIKitCore 0x00000001e7439264 -[UIView _createLayerWithFrame:] + 396
6 UIKitCore 0x00000001e7439e48 UIViewCommonInitWithFrame + 808
7 UIKitCore 0x00000001e7439ac8 -[UIView initWithFrame:] + 124
8 UIKitCore 0x00000001e7837c98 -[_UITextFieldContentView initWithContentContextProvider:] + 60
9 UIKitCore 0x00000001e7384190 -[UITextField _initContentView] + 56
10 UIKitCore 0x00000001e736a7c0 -[UITextField initWithFrame:] + 404
11 UIKitCore 0x00000001e71caa48 -[UISearchBarTextField initWithFrame:] + 44
12 UIKitCore 0x00000001e71c88e8 -[UISearchBar+ 7813352 (UISearchBarStatic) _setupSearchField] + 64
13 UIKitCore 0x00000001e71bac90 -[UISearchBar initWithCoder:] + 1264
14 UIKitCore 0x00000001e6e3bd64 -[UIClassSwapper initWithCoder:] + 248
15 UIFoundation 0x00000001c4a07e88 UINibDecoderDecodeObjectForValue + 744
16 UIFoundation 0x00000001c49a6b3c -[UINibDecoder decodeObjectForKey:] + 320
我发现创建UISearchBar 的时候后面会调用UITextField的创建方法。我想哦~问题可能出在这上面,可是我还是一头雾水,翻查了一下文档,和各种资料,然后突然在 一篇文章中找到了一条线索。
三、问题解决办法
上面这条线索让我把注意力移到了类扩展和分类上面去排查问题。崩溃日志最后是UITextField,所以我就把目标主要看UITextField 的分类或者扩展,当我看到下方分类时突然看到里面的代码
也同样进行leftView的操作,我会心一笑,问题应该就是这个了,我试着把这个分类先去除以后,果然问题就迎刃而解了。
四、结束语
本人也在不断的学习以及摸索中,如有不对的地方欢迎指出,在下方回复或者邮件都可以,谢谢大家的阅读。