1. 程式人生 > >iOS中json解析出現NSNull的異常閃退處理方法

iOS中json解析出現NSNull的異常閃退處理方法

JSON建構有兩種結構:

json簡單說就是JavaScript中的物件和陣列,所以這兩種結構就是物件和陣列2種結構,通過這兩種結構可以表示各種複雜的結構

  • 1、物件:物件在js中表示為“{}”擴起來的內容,資料結構為
    {key:value,key:value,…}的鍵值對的結構,在面向物件的語言中,key為物件的屬性,value為對應的屬性值,所以很容易理解,取值方法為物件.key
    獲取屬性值,這個屬性值的型別可以是 數字、字串、陣列、物件幾種。
  • 2、陣列:陣列在js中是中括號“[]”擴起來的內容,資料結構為
    [“Java”,”javascript”,”vb”,…],取值方式和所有語言中一樣,使用索引獲取,欄位值的型別可以是數字、字串、陣列、物件幾種。
    經過物件、陣列2種結構就可以組合成複雜的資料結構了。

為什麼後臺在返回的接口裡面數據會出現“NSull”資料?

  • 這是由於在資料庫裡面,預設資料為NSull,如果你修過資料後,又刪除,那麼資料庫會自動補充上NSull

  • 我們可以在資料裡面,修改預設資料的方式:在建立表的時候,新增上not null default ’ ‘

下面我們來了解下怎麼解決這個問題,這裡用了ios的Runtime執行時來解決,防止出現程式閃退的情況。
在Github上找到一個牛逼的老外寫了一個Category,叫做NullSafe ,在執行時操作,把這個討厭的空值置為nil,而nil是安全的,可以向nil物件傳送任何message而不會奔潰。這個category使用起來非常方便,只要加入到了工程中就可以了,你其他的什麼都不用做,對,就是這麼簡單。詳細的請去

Github上檢視;

簡單點說,當我們給一個NSNull物件傳送訊息的話,可能會崩潰(null是有記憶體的),而傳送給nil的話,是不會崩潰的。
作者就是使用了這麼一個原理,把傳送給NSNull的而NSNull又無法處理的訊息經過如下幾步處理:

建立一個方法快取,這個快取會快取專案中類的所有類名。
遍歷快取,尋找是否已經有可以執行此方法的類。
如果有的話,返回這個NSMethodSignature。
如果沒有的話,返回nil,接下來會走forwardInvocation:方法。
[invocation invokeWithTarget:nil];將訊息轉發給nil。
那麼,如何判斷NSNull無法處理這個訊息呢,在OC中,系統如果對某個例項傳送訊息之後,它(及其父類)無法處理(比如,沒有這個方法等),系統就會發送methodSignatureForSelector訊息,如果這個方法返回非空,那麼就去執行返回的方法,如果為nil,則傳送forwardInvocation訊息。

這樣就完成整個轉發鏈了。