1. 程式人生 > >IOS使用 swizzle 解決一些錯誤

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