常用設(shè)計(jì)模式整理

ios面試題(整理)

  1. ios常用的設(shè)計(jì)模式有哪些?

MVC模式针余、委托模式毙玻、觀察者模式(kvo、kvc土居、通知機(jī)制)、單例模式.

我對觀察者的理解:就好像一個(gè)人在炒股,一夜暴富,他的狀態(tài)從貧窮變?yōu)楦挥?他通知他的親朋好友,然后他的親朋好友根據(jù)自身要求改變.

一個(gè)對象在自身狀態(tài)發(fā)生改變后,通知監(jiān)視他的對象,監(jiān)視他的對象根據(jù)自身?xiàng)l件發(fā)生改變.

對通知機(jī)制的理解:就相當(dāng)于我們平時(shí)發(fā)說說,將我們當(dāng)前的狀態(tài)發(fā)布在QQ空間,對你感興趣的人,會將你設(shè)為特別關(guān)注,只要你發(fā)動態(tài),那個(gè)人就會收到通知.

一個(gè)對象將他的狀態(tài)發(fā)布在通知里面,對他感興趣的對象,可以申請?jiān)谔囟ㄍㄖl(fā)布時(shí)接受這個(gè)通知.

  1. kvc的底層實(shí)現(xiàn)原理是什么?

Kvc在單類情況下,用setValue:forkey(相當(dāng)于set) 和valueForKey(get)訪問屬性.在類嵌套下,用setValue: forKeyPath(set)和valueForKeyPath(get)訪問.如果訪問不到,就會報(bào)出setValue:forUndleKey這個(gè)錯(cuò)誤.

在ios開發(fā)中,我們可以通過set和get方法來訪問對象的屬性,若一個(gè)對象的屬性沒有提供get和set方法,外界就失去了訪問這個(gè)屬性的訪問渠道,針對這種情況,ios提供了kvc機(jī)制,可以間接訪問對象的屬性.操作屬性,獲取key路徑,處理不存在的key.

Kvc是一種通過對象的屬性名稱,將其作為key,簡接的訪問該屬性的機(jī)制.假設(shè)有一個(gè)Person類,該類有一個(gè)name屬性,對于setValue:屬性值 forKey:@”name”這句代碼,底層的執(zhí)行機(jī)制如下:

(1) 程序會優(yōu)先考慮setName方法,代碼會通過setter方法完成設(shè)置.

(2) 若Person類沒有name屬性的setter方法,kvc機(jī)制會搜索該類中名稱為_name的成員變量,無論成員變量在類的接口部分定義,還是在類的實(shí)現(xiàn)部分定義,甚至用任意的訪問修飾符,底層實(shí)際上就是對名稱為_name的成員變量賦值.

(3) 若Person類中既沒有setName方法,也沒有定義名稱為_name的成員變量,那么,kvc機(jī)制就會搜索該類名字為name的成員變量,無論該成員變量是在類的接口部分定義,還是在類的實(shí)現(xiàn)部分定義,甚至是用任意的訪問修飾符修飾,這條kvc代碼底層就是對name成員變量賦值.

(4) 如果以上3條沒有找到,系統(tǒng)會執(zhí)行該對象的setValue:forUndefinedKey方法.同理,valueForKey:@”name”這句代碼也會遵循相同的方式,一步一步搜素.

  1. Kvo底層實(shí)現(xiàn)原理

Kvo機(jī)制是由oc強(qiáng)大的runtime所支持的,程序在運(yùn)行的過程中,系統(tǒng)會自動地通過runtime給被監(jiān)聽的對象創(chuàng)建一個(gè)子類,其名稱為”NSKVONotifying_類名稱”,并重寫該子類的set方法,在set方法調(diào)用監(jiān)聽者的observeValueForKeyPath:ofObject:change:context:方法.

單例模式:如果全局都用到了.在內(nèi)存中可以只創(chuàng)建一份,節(jié)省內(nèi)存.

類工廠方法的實(shí)現(xiàn)

  •  (void)sharedSingleton{
    
  •  Static  Dispatch_once_t onceToken;
    

Dispatch_once (&onceToken,^{

_ShareInstance = [super allocwithZone:zone];

});

return _shareInstance;

}

//用copywithzone重寫

  •  (void)copyWithZone:(struct_NSZone *)zone{
    
  •  return_shareInstance;
    
  •  }
    

我們?yōu)槭裁从肎CD的dispatch_once實(shí)現(xiàn)單例呢,因?yàn)镈ispatch_once有兩個(gè)參數(shù),dispatch_once_t,可以判斷線程是否被調(diào)度,保證線程安全.dispathc_block_t,保證代碼塊只被調(diào)用一次.優(yōu)點(diǎn):線程安全,很好的滿足了靜態(tài)分析器的要求,能夠自動應(yīng)用計(jì)數(shù)兼容,僅僅只需要少量的代碼.

缺點(diǎn):仍然可以運(yùn)行創(chuàng)建一個(gè)非共享的實(shí)例,可以使用alloc實(shí)例化一個(gè)對象.

Delegate傳值

兩個(gè)控制器,第一個(gè)控制器要向第二個(gè)控制器傳值,第一個(gè)控制器就需要聲明一個(gè)代理協(xié)議,把要傳遞的參數(shù)寫在協(xié)議的聲明方法里.在第一個(gè)控制器聲明里,引入@property(nonatomic,weak)id< ----delegate>delegate屬性.在實(shí)現(xiàn)文件里,需要判斷一下協(xié)議是否響應(yīng)了協(xié)議方法.

If ([_delegate isResponseSelector:@selector(_____delegate聲明的方法) ]{

};

在第二個(gè)控制器里面,實(shí)現(xiàn)聲明的代理方法.這樣就完成了傳值.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嬉探,一起剝皮案震驚了整個(gè)濱河市擦耀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涩堤,老刑警劉巖埂奈,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異定躏,居然都是意外死亡账磺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門痊远,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垮抗,“玉大人,你說我怎么就攤上這事碧聪∶鞍妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵逞姿,是天一觀的道長辞嗡。 經(jīng)常有香客問我,道長滞造,這世上最難降的妖魔是什么续室? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮谒养,結(jié)果婚禮上挺狰,老公的妹妹穿的比我還像新娘。我一直安慰自己买窟,他們只是感情好丰泊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著始绍,像睡著了一般瞳购。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亏推,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天学赛,我揣著相機(jī)與錄音年堆,去河邊找鬼。 笑死罢屈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篇亭。 我是一名探鬼主播缠捌,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼译蒂!你這毒婦竟也來了曼月?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柔昼,失蹤者是張志新(化名)和其女友劉穎哑芹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捕透,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡聪姿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乙嘀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片末购。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虎谢,靈堂內(nèi)的尸體忽然破棺而出盟榴,到底是詐尸還是另有隱情,我是刑警寧澤婴噩,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布擎场,位于F島的核電站,受9級特大地震影響几莽,放射性物質(zhì)發(fā)生泄漏迅办。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一章蚣、第九天 我趴在偏房一處隱蔽的房頂上張望礼饱。 院中可真熱鬧,春花似錦究驴、人聲如沸镊绪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝴韭。三九已至,卻和暖如春熙侍,著一層夾襖步出監(jiān)牢的瞬間榄鉴,已是汗流浹背履磨。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庆尘,地道東北人剃诅。 一個(gè)月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像驶忌,于是被迫代替她去往敵國和親矛辕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

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

  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,143評論 30 470
  • 設(shè)計(jì)模式是什么付魔? 你知道哪些設(shè)計(jì)模式聊品,并簡要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)几苍,就是用比較成熟的邏輯去處理某一種類型的...
    Jt_Self閱讀 747評論 0 4
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,356評論 0 35
  • 多線程翻屈、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場景妻坝。SDWebImage的原...
    LZM輪回閱讀 2,007評論 0 12
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,717評論 0 4