IOS使用 swizzle 解決一些錯誤
不知道你有沒有經常遇到 這種 引數為 nil 的錯誤 或者是 陣列錯誤。
而且現在在 多執行緒中 還是 大量使用 block 的情況下 要查詢起來 實在是 太費勁了
所以 我用了個 取巧的辦法(可能會導致你的邏輯錯誤) 用swizzle 來替換這些沒驗證的方法
我是按我自己 umeng 的 錯誤統計來寫的 給出個 例子而已
+(void)callSafeCategory { NSError* error = nil; [objc_getClass("__NSPlaceholderArray") jr_swizzleMethod:@selector(initWithObjects:count:) withMethod:@selector(SY_safeInitWithObjects:count:) error:&error]; LOG_Error [objc_getClass("__NSArrayI") jr_swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(SY_safeObjectAtIndex:) error:&error]; LOG_Error [objc_getClass("__NSArrayM") jr_swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(SY_safeObjectAtIndex:) error:&error]; LOG_Error [objc_getClass("__NSArrayM") jr_swizzleMethod:@selector(addObject:) withMethod:@selector(SY_safeAddObject:) error:&error]; LOG_Error [objc_getClass("__NSDictionaryI") jr_swizzleMethod:@selector(objectForKey:) withMethod:@selector(SY_safeObjectForKey:) error:&error]; LOG_Error [objc_getClass("__NSDictionaryM") jr_swizzleMethod:@selector(objectForKey:) withMethod:@selector(SY_safeObjectForKey:) error:&error]; LOG_Error [objc_getClass("__NSDictionaryM") jr_swizzleMethod:@selector(setObject:forKey:) withMethod:@selector(SY_safeSetObject:forKey:) error:&error]; LOG_Error [NSURL jr_swizzleClassMethod:@selector(fileURLWithPath:isDirectory:) withClassMethod:@selector(SY_safeFileURLWithPath:isDirectory:) error:&error]; LOG_Error [NSFileManager jr_swizzleMethod:@selector(enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:) withMethod:@selector(SY_safeEnumeratorAtURL:includingPropertiesForKeys:options:errorHandler:) error:&error]; LOG_Error }
然後在替換的方法裡面 加入引數驗證
@implementation NSArray(SYSafeCategory) -(id)SY_safeObjectAtIndex:(int)index{ if(index>=0 && index < self.count) { return [self SY_safeObjectAtIndex:index]; } else{ #ifdef DEBUG NSAssert(NO,nil); #endif } return nil; } -(id)SY_safeInitWithObjects:(const id [])objects count:(NSUInteger)cnt { for (int i=0; i<cnt; i++) { if(objects[i] == nil) return nil; } return [self SY_safeInitWithObjects:objects count:cnt]; } @end @implementation NSMutableArray(SYSafeCategory) -(void)SY_safeAddObject:(id)anObject { if(anObject != nil){ [self SY_safeAddObject:anObject]; } } @end
示例地址:
相關推薦
IOS使用 swizzle 解決一些錯誤
不知道你有沒有經常遇到 這種 引數為 nil 的錯誤 或者是 陣列錯誤。 而且現在在 多執行緒中 還是 大量使用 block 的情況下 要查詢起來 實在是 太費勁了 所以 我用了個 取巧的辦法(可能會導致你的邏輯錯誤) 用swizzle 來
iOS開發之一些錯誤集錦
######No1. NSAutoreleasePool’ is unavailable: not available in automatic reference counting mode 答:根據Objective-C 2.0程式設計上的舊版本的程式碼會發
python解決一些錯誤換行問題
有時候會碰到一些錯誤換行的資料,比如正確資料應該是: 20141010,aaa,bbb,ccc,ddd,eee 但是實際給過來的資料是: 20141010,aaa,bbb, ccc,ddd, eee
SVN的安裝與常用功能使用以及解決安裝配置過程中的一些錯誤
三種方式 安裝配置 ava -- 服務器 工作流程圖 例如 完成 網站 SVN簡介: SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統,將工程代碼集中在服務器上進行一個統一的集中式管理,從而能夠方便地控制代碼版本,相較於RCS、CVS,它采用了分支管理系統
nmake下一些錯誤的解決辦法
最近需要安裝一下liblineaner這個庫,https://github.com/cjlin1/liblinear windows下面的安裝過程如下: 1. Open a dos command box and change to liblinear directory. If en
手勢識別中一些錯誤解決方法
最近在看一個手勢識別的專案時,遇到了一些錯誤,主要原因是該專案是使用python2.7+opencv2.4.8,而我的環境是python3.5.2+opencv3.1.0, 於是將一些解決方法記錄下來,希望能夠幫助其他人少走些彎路。 1. 背景分離函式
講excel表插入oracle時出現的一些錯誤,以及解決方法
出現這個提示的時候是說明,在插入的employeename這一個欄位裡面有空值,切記,不是空格,是空值,而我們需要做的是看是否是遺漏了這個名字,或者是包含空值這一行不需要,這時刪除就行,具體情況,具體分析。 情況場景: 表A中有個欄位是外來鍵,關聯了表B中的某欄位,
Hadoop 一些錯誤解決
1. Input path does not exist:file:/路徑名 這個問題肯定是core-site.xl 配置檔案中fs.defaultFS配置項配置不正確。如果是本機執行hadoop,那麼需要修改配置檔案中此配置項為hdfs://IP:Por
【iOS開發】一些常見的警告解決方案(更新中。。。)
Unknown pattern color for the Background Color attribute 1.背景色屬性為未知模式的顏色 解決:預設xib裡面控制元件的背景色為Default。如果出現警告,可能是你定義的顏色Xcode啟動
GitHub上傳程式碼的方法以及出現的一些錯誤的解決辦法
最近想把之前寫的網頁掛到網上去,搜尋後發現GitHub的homepage可以實現。 昨天花了半天的時間在從GitHub建倉庫開始,最終把我的網頁成功掛到網上。中間出現了一些問題,後來通過百度解決了。所以就想把昨天找到的一些教程和問題解決辦法總結起來,方便自己也方便大家。同時
caffe編譯出現的一些錯誤及解決方法(僅供參考)
1、make pytest時,出現layer_factory.hpp:77 ] Check failed: registry..... 解決方法:開啟caffe目錄下的Makefile.config檔案,找到WITH_PYTHON_LAYER := 1這一行,將前面的‘#
GeoMesa操作HBase遇到的一些錯誤解決辦法
1.錯誤一:java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/coprocessor/CoprocessorService 具體如下: Exception in thread "main" java.
qt 環境配置的一些錯誤解決
1.Cannot connect creator comm socket /tmp/qt_temp.u14973/stub-socket: No such file or directory 開啟Tool->Options->Environment->
Git 一些錯誤的解決方法
Git初學者的個人經驗記錄,僅供參考 1. Pull is not possible because you have unmerged files. 症狀:pull的時候 $ git pull Pull is not possible because you have
iOS【開發常見錯誤https問題解決】
遇到的錯誤 The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. 少年莫慌,這是升級的ios9的
MT7688 編譯過程中的一些錯誤的解決方法
1.將編譯好的韌體燒錄到板子中,在啟動時出現 LZMA ERROR 1 - must RESET board to recove 解決:這是由於系統中lzma的版本太高的願意所致,解決方法就是降低版本! 1)解壓lzma-4.32.7.tar.gz (1)./co
Eclipse SVN的一些錯誤解決方法
一、org.tigris.subversion.javahl.ClientException: Attempted to lock an already-locked dir異常解決方法 myeclipse用svn提交的時候報錯: Attempted to lock
tensor小白記錄一些解決掉的難以解決的錯誤(一)——tensorboard
1 程式碼沒問題的情況下,使用tensorboard命令開啟網頁,顯示無資料。看第一行命令:tensorboard --logdir = logs我的logs就放在當前目錄下面,也就是logs是myopencv的子目錄。對,就是那個深藍色看不清的。看起來很對對不對,沒什
solr 4.3的一些錯誤解決方法
在去年時候學習使用了solr4.0,現在solr版本最新已經到了4.3了,前兩天因為工作需要在一臺伺服器上面新安裝solr,但是生產環境是4.0,不過想到是內部測試用的,且主要功能就是寫入,刪除,搜尋,與程式上面沒有太多的深入開發,於是還是安裝了最新的4.3版本 解壓安裝啟動後,就可以了;這時需要新增col
解決win10下配置matlab介面的GPU版Caffe時常遇到的一些錯誤
如何配置windows10下的MATLAB介面的GPU版本的caffe,網上的教程挺多的,但因為大家用的硬軟體不同,按教程配置下來以後,往往會出現一些小問題。在此,分享一下幾個常見問題的解決方法。具體配置過程可以參見http://www.cnblogs.com/alcoh