你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> Unrecognized Selector Sent to Instance問題

Unrecognized Selector Sent to Instance問題

編輯:IOS開發基礎

前不久在微博上看到一篇文章,《UNRECOGNIZED SELECTOR SENT TO INSTANCE 問題快速定位的方法》 其中講了iOS unrecognized selector sent to instance問題的快速定位方法,方法是不錯的,但是實際測試發現文中的方法並非萬能,從我自身的經歷以及文中的評論看都有不能解決的情況。

出現unrecognized selector sent to instance問題,大部分是因為對象被提前釋放,指針變成野指針,還有一種情況是本身就是野指針,如聲明一個局部對象,沒有初始化就直接調用。定位難 的原因是你知道這個野指針指到哪個類了,但是不知道是哪裡產生了野指針。如果一個正常的對象調用一個不存在的方法,也會給出這個提示,不過這種情況下 Xcode會直接給出crash的代碼行,不存在定位難的問題。

我遇到這個問題的情況是這樣的:寫的代碼一直在iOS 7下進行調試,運行得好好的,最近想測試一下iOS6的兼容性,結果登錄成功後就會產生 crash,提示[NewsViewController size] unrecognized selector sent to instance,看到這個問題當時真是相當莫名其妙,NewsViewController無論如何都不可能有size這個方法,是什麼讓 NewsViewController調用這個方法呢?

在Xcode中用size關鍵詞搜索所有調用size的地方一個個排除?別逗了,代碼裡多的是。想象一下,你在iOS7下寫好了全部代碼,然後在iOS6下測試兼容性時出現此問題,面對茫茫如海的代碼,足夠讓你望洋興歎了,一個個去找,費不起那功夫。

想起來上面那篇文章中的方法,結果是毫無幫助,下斷點無效。

只得再另想辦法。要快速定位問題代碼行,主要思路還是得下斷點,還有沒有別的辦法下斷點呢?這個時候可就要在“unrecognized selector sent to instance”的提示上做文章了,這個提示的實際意義是某個對象調用了不存在的方法。不妨逆向思考一下,既然它沒有,我如果給它加上一個呢?這不下斷 點的機會就來了——所謂誘敵深入,關門打狗,不過如此。

於是,我就在NewsViewController中加了一個這樣的方法:

QQ圖片20160315175716.jpg屏幕快照 2016-03-15 下午5.46.37.png

在其中的NSLog行加上斷點,運行工程,果然就找到了調用該方法的代碼行,問題迎刃而解。

出錯的代碼也貼一下吧,簡化一下大概就是下面這樣的:

36.jpg

問題出在NSLog的那一行,很顯然,這就是沒有初始化的局部對象在實際訪問時出錯,系統認為它是NewsViewController對象, 不再屬於UIImage類了。

需要注意的是,上面的代碼你拿過去並不一定能復現同樣的問題,可能就不會發生crash了。這裡只是提供另一種解決思路,希望對遇到此問題的人有所幫助。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved