iOS修改私有屬性&&成員變量(KVC)

一、概述

修改私有屬性,是我們?nèi)粘i_發(fā)中常見(jiàn)的一個(gè)場(chǎng)景。比如修改三方庫(kù)的某個(gè)屬性,可三方庫(kù)并沒(méi)有暴露該屬性在頭文件??偟膩?lái)說(shuō),修改私有屬性,兩種方案:KVC和Runtime。今天這里不介紹原理,只講實(shí)操。
總體思路:通過(guò)繼承要修改類,拿到要修改的屬性或者成員變量,改變其值,再賦值給該類。

二、KVC

以下舉例,通過(guò)子類ZXSonViewController繼承父類ZXParentViewController和,在viewDidLoad方法里做演示。

I、屬性類型-系統(tǒng)類

父類定義了私有屬性name


image.png

子類繼承父類,通過(guò)KVC修改


image.png

打印結(jié)果:
image.png

II、屬性類型-自定義類

此時(shí)使用的Api由[setValue: forKey:]換為[setValue:forKeyPath:]
父類使用自定義類一個(gè)作為屬性


image.png

子類通過(guò)[setValue:forKeyPath:] 修改


image.png

看下打印結(jié)果
image.png

III、成員變量-非枚舉

當(dāng)修改的是成員變量時(shí)


image.png

子類


image.png

打印結(jié)果
image.png

IV、成員變量-枚舉

由于struct本身并不遵循KVC協(xié)議,但是我們可以轉(zhuǎn)化為NSValue解決

父類使用一個(gè)枚舉做成員變量


image.png

子類通過(guò)五步操作,修改父類成員變量值

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /**當(dāng)修改私有變量時(shí)枚舉時(shí),由以下五步*/
    
    //1、通過(guò)KVC獲取父類父類成員變量,賦值給NSValue
    NSValue* result = [self valueForKey:@"location"];
    
    //2、將NSValue轉(zhuǎn)化為結(jié)構(gòu)一樣,但名字不一樣的新結(jié)構(gòu)體
    struct ZXSonLocation sonLocation;
    [result getValue:&sonLocation];
    
    //3、修改目標(biāo)字段
    sonLocation.x = 999.0;
    
    //4、將新的結(jié)構(gòu)體再轉(zhuǎn)為NSValue
    NSValue* newValue = [NSValue valueWithBytes:&sonLocation objCType:@encode(struct ZXSonLocation)];

    //5、通過(guò)KVC賦值給父類
    [self setValue:newValue forKey:@"location"];

}

截圖如下


image.png

看下打印結(jié)果

image.png

三、總結(jié)

通過(guò)KVC修改私有屬性或者成員變量的方法基本都列舉完了,但注意KVC本身屬于硬編碼形式,容易操作閃退,使用時(shí)要做好安全防護(hù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • #pragma clang diagnostic push #pragma clang diagnostic ig...
    戀空K閱讀 327評(píng)論 0 1
  • 無(wú)論是在我們的今后的工作當(dāng)中還是面試找工作當(dāng)中,這兩個(gè)知識(shí)點(diǎn)是十分重要的,有些同學(xué)們對(duì)這方面的知識(shí)還是不是很了解,...
    葉情宇閱讀 687評(píng)論 1 2
  • 無(wú)論是在我們的今后的工作當(dāng)中還是面試找工作當(dāng)中,這兩個(gè)知識(shí)點(diǎn)是十分重要的,有些同學(xué)們對(duì)這方面的知識(shí)還是不是很了解,...
    __weak閱讀 1,311評(píng)論 2 16
  • KVO (Key-Value Observing),俗稱“鍵值監(jiān)聽(tīng)”,能夠用來(lái)監(jiān)聽(tīng)對(duì)象屬性的變化,也是 Objec...
    valentizx閱讀 480評(píng)論 0 3
  • 1. Basic methods KVC(Key-value coding)鍵值編碼,就是指iOS的開發(fā)中,可以允...
    木小易Ying閱讀 241評(píng)論 0 4

友情鏈接更多精彩內(nèi)容