我們寫代碼的時候,有的類沒有給對外接口恬总,但是我們需要它的私有成員變量或者函數(shù)應(yīng)該怎么辦呢前普?
其實我們可以通過runtime訪問類的私有成員變量和函數(shù),讓我們來實際操作看看壹堰。
1.操作類的私有變量
1.1 取出類的私有變量
1.1.1定義一個場景拭卿,有一個記者類(Report.h/.m),還有一個體檢信息類(PersonInfo.h/.m),我們在PersonInfo類在頭文件中定義一個公開變量personName贱纠,.m文件中定義一個私有NSString變量(phoneNumber)峻厚,一個NSDictionary變量(bodyData),init方法中初始化這三個變量,如下圖所示:
runtime1.png
1.1.2假設(shè)我們想從PersonInfo中取出bodyData谆焊,我們可以使用下面的代碼惠桃,定義一個Report類,在.m中實現(xiàn)方法-(NSDictionary *)getPersonInfobodyData:(id)objcPerson,具體實現(xiàn)如下:
runtime2.png
1.1.3讓我們調(diào)用一下這個方法辜王,看看是否真的能夠取出PersonInfo的初始體檢數(shù)據(jù)劈狐。
runtime3.png
1.1.4可以看出我們成功的取到了私有變量bodyData里面的數(shù)據(jù):height和weight
runtime4.png
1.2 操作類的私有變量
1.2.1對于我們?nèi)〕鰜淼臄?shù)據(jù),我們不僅可以讀呐馆,也可以寫肥缔,也就是說我們可以修改取出來的數(shù)據(jù)。上面圖片中我們看的出來PersonInfo中初始化了phoneNumber這個私有變量汹来,它的值是15612345678续膳,使用下面代碼,我們可以改變phoneNumber中的值收班。
runtime11.png
1.2.2讓我們運行一下看看坟岔,可以看到phoneNumber的值被修改了。
runtime12.png
2.操作類的私有方法
2.1既然我們可以獲取類的私有變量闺阱,那么我們可以獲取到類的私有方法么炮车?答案是肯定的,我們可以讀出類的所有私有方法名酣溃,包括setter,getter方法。
runtime5.png
2.2讓我們看看輸出結(jié)果
runtime6.png
2.3那么我們能夠直接使用某個私有方法么纪隙?MRC中或許還可以赊豌,ARC中就不行了。那么我們真的沒辦法使用私有方法了么绵咱?答案是否定的碘饼,我們可以通過一些輔助手段,替換私有方法的實現(xiàn)悲伶,從而達到調(diào)用方法的目的艾恼。以PersonInfo中college函數(shù)為例。具體實現(xiàn)如下:
runtime7.png
2.4我們定義一個Helper類來幫助我們達到使用college函數(shù)實現(xiàn)的目的麸锉。Helper類定義一個方法-(void)helpAssist钠绍,具體實現(xiàn)如下:
runtime8.png
2.5我們交換兩個類的方法,然后讓Helper的實例調(diào)用HelperAssist,將使用到下面代碼:
runtime9.png
2.6我們運行之后打印會發(fā)現(xiàn)花沉,雖然調(diào)用的是Helper實例的HelperAssist方法柳爽,但是打印出了college中的打印信息。同理碱屁,我們可以通過這種方法替換掉私有方法的具體實現(xiàn)磷脯。
runtime10.png
3.獲取類的私有成員變量和方法
3.1通過上面的練習(xí)我們可以看得出來,如果我們要獲取私有變量或者替換私有方法娩脾,我們必須知道變量名和方法名赵誓,但是有的時候我們僅僅知道類的頭文件而已,這種情況下,我們可以先獲取類的成員變量俩功,實例方法和類方法幻枉,然后在進行操作。
3.2為了演示效果绑雄,我們將類ConfidentialEmail打包成一個.a靜態(tài)庫展辞,頭文件中也沒有實現(xiàn)任何借口颂斜,確保我們對ConfidentialEmail的實現(xiàn)一無所知缭受。
runtime14.png
3.3首先看一下獲取類成員變量和屬性名的方法
runtime15.png
3.4接著我們看一下如何獲取類的類方法和實例方法
runtime16.png
3.5讓我們運行一下看看,可以看到我們打印出了ConfidentialEmail類的私有信息爵憎,根據(jù)我們上面的方法霜定,就可以愉快的獲取和操作了辖源。
runtime17.png
3.6最后讓我們看看ConfidentialEmail的.m文件勋锤,看看我們是否真的取出了正確的信息痘番。
runtime18.png