利用Runtime實現自動化歸檔

2021-07-10 08:34:30 字數 2977 閱讀 3520

對於物件的歸檔,之前使用mj老師mjextension框架做字典轉模型的時候,直接使用巨集mjcodingimplementation就能實現物件自動實現存檔和解檔的方法,很是好用。但是有時候會遇到不需要用到字典轉模型,不想使用框架時,就需要自己手動乙個乙個實現,有時候屬性一多了,簡單卻繁瑣的相同**會讓人覺得有點不耐煩。剛好看到袁崢老師的文章《讓你快速上手runtime》,於是自己想動手來實現用runtime,實現自動化歸檔,整個專案的**github

以下是乙個可以跳過的步驟,簡單的為自己回顧了實現物件歸檔的原始方法,建立乙個類叫做學生類,其中學生有name,和***屬性。

/** name */

@property (nonatomic,copy) nsstring *name;

/** *** */

@property (nonatomic,copy) nsstring ****;

我們要對student類的物件實現歸檔的時候,需要做以下的步驟

類的標頭檔案遵守

@inte***ce studentmodel : nsobject

在類的.m檔案中,實現以下方法

// 存檔的時候需要實現

- (void)encodewithcoder:(nscoder *)acoder

// 解檔的時候需要實現

- (id)initwithcoder:(nscoder *)adecoder

return

self;

}

在需要存檔和從檔案中解析存檔的物件實現

// 將student物件歸檔到file中

[nskeyedarchiver archiverootobject:student tofile:file]

// 從file存檔中解析物件到student中

student *student = [nskeyedunarchiver unarchiveobjectwithfile:file];

這樣,只需要這三個步驟我們就簡單的實現了歸檔。看起來好像歸檔的過程並不麻煩,簡簡單單幾句話就能實現了,為何需要用到執行時呢? 在這個例子中,我們的類只有2個屬性:name和***,於是我們在存檔和解檔的時候分別對這兩個屬性進行了處理,萬一這個類的屬性很多呢?! 請看下面這張圖

坑爹啊,這後台返回的引數,乙個個屬性實現歸檔,都快把我寫哭了!t t 於是想要找到一種偷懶的方式要實現自動化歸檔,於是這時候,runtime就派上用場了!

首先,我們需要利用執行時為我們做到的一步是,通過執行時,獲取類中的所有成員屬性,這裡用到了執行時的方法

objc_export ivar *class_copyivarlist(class cls, unsigned

int *outcount)

這裡引用了袁崢老師的注釋來加強對這一方法的認識

// ivar:成員屬性的意思

// 第乙個引數:表示獲取哪個類中的成員屬性

// 返回值ivar *:指的是乙個ivar陣列,會把所有成員屬性放在乙個陣列中,通過返回的陣列就能全部獲取到。

於是我們需要寫乙個方法,來返回乙個陣列類中的所有屬性名稱

// 返回self的所有物件名稱

+ (nsarray *)propertyofself

return [propernames copy];

}

在這裡,我們已經獲取到類中的所有屬性的名稱,接著我們需要在encodewithcoder對屬性名稱和屬性的值進行歸檔操作,在這裡我們遇到了乙個問題,如何把屬性名稱和屬性的值對應起來呢。

在這裡我們需要知道nsstringfromselector(方法名)返回的是乙個sel變數指向方法名中的方法

我們注意到每個屬性都有兩個共同的方法那就是set方法和get方法,那麼我們只需要通過屬性名字,建立屬性名指向的方法也就是get方法,就能獲取到屬性名對應的值。

// 歸檔

- (void)encodewithcoder:(nscoder *)encoder

}

接下來,我們需要對類實現解檔方法。這裡我們遇到第二個問題,如何對屬性名的屬性進行賦值呢?這裡我們需要用到屬性的set方法,利用屬性名,拼接出乙個set方法的字串,並建立乙個指向屬性set方法的sel變數,並且利用performselector實現賦值

// 解檔

- (id)initwithcoder:(nscoder *)adecoder

return

self;

}

就這樣,我們實現了對乙個類實現自動歸檔的類,下次需要建立乙個model類時,只要繼承自我們編寫的這個類,就能實現自動歸檔啦,是不是很輕鬆呢。其實拿到類的屬性名可以擴充套件很多內容,例如我們每次列印model類的時候,都需要乙個model裡的屬性都拼接出來,利用我們剛剛寫的**,重寫description方法,就能實現在nslog的時候把物件裡的每個屬性和值都列印出來了

- (nsstring *)description

return [descriptionstring copy];

}

利用Python實現報表自動化

匯入源資料 import pandas as pd from datetime import datetime data pd.read csv r users faye desktop order 14.1.csv parse dates 成交時間 parse dates將資料解析為時間格式 da...

Runtime實現歸 解檔

import inte ce nsobject agcoding 遵守編碼協議 end 複製 import nsobject agcoding.h import import 成員變數型別 獲取 例項變數的型別 方法 nslog s ivar gettypeencoding array i stat...

Runtime實現歸 解檔

import inte ce nsobject agcoding 遵守編碼協議 end 複製 import nsobject agcoding.h import import 成員變數型別 獲取 例項變數的型別 方法 nslog s ivar gettypeencoding array i stat...