runtime獲取類私有變量及方法

我們寫代碼的時候,有的類沒有給對外接口恬总,但是我們需要它的私有成員變量或者函數(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伊履,一起剝皮案震驚了整個濱河市核无,隨后出現(xiàn)的幾起案子扣唱,更是在濱河造成了極大的恐慌,老刑警劉巖团南,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件噪沙,死亡現(xiàn)場離奇詭異,居然都是意外死亡吐根,警方通過查閱死者的電腦和手機正歼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拷橘,“玉大人局义,你說我怎么就攤上這事∪叽” “怎么了萄唇?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長术幔。 經(jīng)常有香客問我另萤,道長,這世上最難降的妖魔是什么特愿? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任仲墨,我火速辦了婚禮,結(jié)果婚禮上揍障,老公的妹妹穿的比我還像新娘目养。我一直安慰自己,他們只是感情好毒嫡,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布癌蚁。 她就那樣靜靜地躺著幻梯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪努释。 梳的紋絲不亂的頭發(fā)上碘梢,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音伐蒂,去河邊找鬼煞躬。 笑死,一個胖子當(dāng)著我的面吹牛逸邦,可吹牛的內(nèi)容都是我干的恩沛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼缕减,長吁一口氣:“原來是場噩夢啊……” “哼雷客!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起桥狡,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤搅裙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后裹芝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體部逮,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年嫂易,在試婚紗的時候發(fā)現(xiàn)自己被綠了甥啄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡炬搭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出穆桂,到底是詐尸還是另有隱情宫盔,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布享完,位于F島的核電站灼芭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏般又。R本人自食惡果不足惜彼绷,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茴迁。 院中可真熱鬧寄悯,春花似錦、人聲如沸堕义。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洒擦,卻和暖如春椿争,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熟嫩。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工秦踪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掸茅。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓椅邓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親倦蚪。 傳聞我的和親對象是個殘疾皇子希坚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容