IOS字典轉模型和KVC

定義: ?把字典中的數(shù)據使用模型來保存。新建一個類,根據字典中鍵值對,來編寫這個類中的屬性,將來用這個類的對象的屬性來保存字典中每個鍵對應的值恨课。

為什么要用字典去轉模型:

0>寫代碼的時候字典的鍵沒有智能提示,但是模型的屬性可以有智能提示

1>"鍵"是字符串,如果寫錯了,編譯器不報錯(在編譯的時候不報錯),運行時可能出錯,出錯了很難找錯编曼。

2>使用"模型"可以更方便的使用面向對象的3大特(封裝唐瀑、繼承谈宛、多態(tài))性進行擴展鸽照。

3>將來的這個"模型"可能會在很多地方被用到(比如有很多個控制器都會使用這個模型),那么每次用到模型的地方都需要寫一次把字典中的數(shù)據賦給模型屬性的代碼,此時如果把這些賦值語句封裝到模型內部,會大大簡化了使用復雜度與代碼量户秤。

字典轉模型需要修改哪里的代碼:

1>創(chuàng)建一個模型類

2>在懶加載數(shù)據的時候,(或者網絡請求數(shù)據后)把加載到的數(shù)據都放到模型對象中,然后再把模型對象放到數(shù)組中码秉。


KVC: (鍵值編碼)

定義: 在對象創(chuàng)建完成之后,動態(tài)(牽扯到運行時)的給對象的屬性賦值

KVC,即是指 NSKeyValueCoding鸡号,一個非正式的Protocol转砖,提供一種機制來間接訪問對象的屬性。而不是通過調用Setter鲸伴、Getter方法訪問府蔗。

在OC的API中:

@interfaceNSObject(NSKeyValueCoding) ?// 非正式協(xié)議

@end

用法:

1>基本取值賦值

賦值: ?[對象:setValue:forkey:]

fu值:[對象:valueforKey]

2> 因為類key反復嵌套,所以有個keyPath的概念汞窗,keyPath就是用.號來把一個一個key鏈接起來姓赤,這樣就可以根據這個路徑訪問下去

3>KVC還有一個很重要的特點,自動裝箱拆箱功能杉辙。這在ObjC中是僅有的模捂,其他情況下均需要使用比如NSNumber來手動拆裝箱的捶朵。

裝箱:把值類型轉換成引用類型 ?若是int 轉換成NSNumer或者NSString

拆箱:將引用類型轉換成值類型 ?與上面想反

4> KVC 還可以對NSArray和NSSet 進行賦值

5> 通過字典去進行賦值(不要忘了重寫那個方法)

[對象setValuesForKeysWithDictionary:dict]

// 若對象沒有值

- (void)setValue:(id)value forUndefinedKey:(NSString *)key

6> 在運行時給私有屬性或者可讀屬性進行賦值

//注意:(解檔和歸檔的方法不是KVC,而是NSCoding這個協(xié)議)

@protocolNSCoding

- (void)encodeWithCoder:(NSCoder*)aCoder;

- (nullableinstancetype)initWithCoder:(NSCoder*)aDecoder;

@end



KVO:(鍵值監(jiān)聽)

2、KVO的是KeyValue Observe的縮寫狂男,中文是鍵值觀察综看。這是一個典型的觀察者模式,觀察者在鍵值改變時會得到通知岖食。iOS中有個Notification的機制红碑,也可以獲得通知,但這個機制需要有個Center泡垃,相比之下KVO更加簡潔而直接析珊。

KVO的使用也很簡單,就是簡單的3步蔑穴。

注冊需要觀察的對象的屬性addObserver:forKeyPath:options:context:

實現(xiàn)observeValueForKeyPath:ofObject:change:context:方法忠寻,這個方法當觀察的屬性變化時會自動調用

取消注冊觀察removeObserver:forKeyPath:context:

KVO:IOS里面的黑魔法,建議不要過多的使用,因為他的模式是一種輪詢的方式,比如,一直在敲門,直到打開門為止,還有一種采用輪訓的方式的是多線程中的自旋鎖.

KVO 代碼示例:

@interfacemyPerson:NSObject

{

NSString*_name;

int_age;

int_height;

int_weight;

}

@end

@interfacetestViewController:UIViewController

@property(nonatomic,?retain)?myPerson?*testPerson;

-?(IBAction)onBtnTest:(id)sender;

@end

-?(void)testKVO

{

testPerson?=?[[myPerson?alloc]?init];

[testPerson?addObserver:selfforKeyPath:@"height"options:NSKeyValueObservingOptionNewcontext:nil];

}

-?(void)observeValueForKeyPath:(NSString*)keyPath?ofObject:(id)object?change:(NSDictionary*)change?context:(void*)context

{

if([keyPath?isEqualToString:@"height"])?{

NSLog(@"Height?is?changed!?new=%@",?[change?valueForKey:NSKeyValueChangeNewKey]);

}else{

[superobserveValueForKeyPath:keyPath?ofObject:object?change:change?context:context];

}

}

-?(IBAction)onBtnTest:(id)sender?{

inth?=?[[testPerson?valueForKey:@"height"]?intValue];

[testPerson?setValue:[NSNumbernumberWithInt:h+1]?forKey:@"height"];

NSLog(@"person?height=%@",?[testPerson?valueForKey:@"height"]);

}

-?(void)dealloc

{

[testPerson?removeObserver:selfforKeyPath:@"height"context:nil];

[superdealloc];

}



自旋鎖:

互斥鎖:

多個線程共享同一個資源時,會造成線程不安全解決方式 互斥鎖

主要是防止多線程搶資源造成的數(shù)據不安全

原理 :每一個對象(NSObject)內部都有一個鎖(變量)當有線程要進入synchronized到代碼塊的時候先檢查對象的鎖是打開或者是關閉默認是打開,當線程會進入代碼的內部,進行上鎖

如果鎖是是關閉的,再有線程執(zhí)行代碼的時候就要先等待,直到上個線程結束后就先等待,直到直到鎖打開就才可以執(zhí)行

@synchronized(self) {// 需要鎖定的代碼} 注意self要是全局對象

atomic :自旋鎖??(單寫多寫) 效率低 (輪訊)

1.使用id作為方法返回值的問題:

1>在接收方法的返回值的時候可以使用任何類型來接收,編譯都不報錯,但是運行時可能出錯。

2.instancetype需要注意的點

1>instancetype在類型表示上,與id意思一樣,都表示任何對象類型

2>instancetype只能用作返回值類型,不能向id一樣聲明變量存和、用作參數(shù)等

3>使用instancetype,編譯器會檢測instancetype的真實類型,如果類型不匹配,編譯時會有個警告(Incompatible pointer types returning 'Person *' from a function with result type 'BFButton *’ 不相容的指針類型“人*”從函數(shù)返回結果類型“BFButton *”)奕剃。(instancetype出現(xiàn)在哪個類型中就表示對應的類型)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捐腿,隨后出現(xiàn)的幾起案子纵朋,更是在濱河造成了極大的恐慌,老刑警劉巖茄袖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件操软,死亡現(xiàn)場離奇詭異,居然都是意外死亡宪祥,警方通過查閱死者的電腦和手機聂薪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來品山,“玉大人胆建,你說我怎么就攤上這事≈饨唬” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵扑馁,是天一觀的道長涯呻。 經常有香客問我,道長腻要,這世上最難降的妖魔是什么复罐? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮雄家,結果婚禮上效诅,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好乱投,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布咽笼。 她就那樣靜靜地躺著,像睡著了一般戚炫。 火紅的嫁衣襯著肌膚如雪剑刑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天双肤,我揣著相機與錄音施掏,去河邊找鬼。 笑死茅糜,一個胖子當著我的面吹牛七芭,可吹牛的內容都是我干的。 我是一名探鬼主播蔑赘,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抖苦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了米死?” 一聲冷哼從身側響起锌历,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎峦筒,沒想到半個月后究西,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡物喷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年卤材,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峦失。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡扇丛,死狀恐怖,靈堂內的尸體忽然破棺而出尉辑,到底是詐尸還是另有隱情帆精,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布隧魄,位于F島的核電站卓练,受9級特大地震影響,放射性物質發(fā)生泄漏购啄。R本人自食惡果不足惜襟企,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狮含。 院中可真熱鬧顽悼,春花似錦曼振、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至府蛇,卻和暖如春集索,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汇跨。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工务荆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人穷遂。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓函匕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚪黑。 傳聞我的和親對象是個殘疾皇子盅惜,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容

  • 作者si1ence2016.05.20 10:24* http://www.reibang.com/p/bc3f8...
    Kiddz閱讀 1,200評論 0 12
  • 1.項目經驗 2.基礎問題 3.指南認識 4.解決思路 ios開發(fā)三大塊: 1.Oc基礎 2.CocoaTouch...
    陽光的大男孩兒閱讀 4,988評論 0 13
  • 對于從事 iOS 開發(fā)人員來說抒寂,所有的人都會答出【runtime 是運行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,721評論 7 64
  • 昨晚降溫,冷風嗖嗖掠剑,霜降車頂屈芜,首感寒襲。 南湖學校朴译,盆友相聚井佑,戶外拓展,歡歌笑語眠寿。 軍人代訓躬翁,考驗團隊,展示凝聚盯拱,...
    沖天農鋤草閱讀 649評論 24 83
  • 永春至平潭坟乾,三個半小時的車程迹辐。 不能下海游泳。 啤酒節(jié)甚侣,演出節(jié)目,免費间学。 海上驚魂殷费,自費印荔。 古城 海上深井 海邊浴...
    躲進小樓看燈火閱讀 166評論 0 0