[記]讀博客之筆記

每天記一下,日積月累况褪,總會(huì)有進(jìn)步。

以下內(nèi)容都是摘自各個(gè)大牛博客

2017-03-10:

objc_msgSend做了什么?

舉個(gè)??objc_msgSend(obj, foo)是如何執(zhí)行的:

  1. 首先通過(guò) objc 的 isa 指針找到它的 class 罐寨;
  2. 再在 class 的 method list 找到 foo ;
  3. 如果 class 中沒(méi)有找到 foo ,繼續(xù)往它的 superclass 中去找序矩;
  4. 只要找到 foo 這個(gè)函數(shù)鸯绿, 就會(huì)去執(zhí)行它的 IMP.

其實(shí)也并不是每次執(zhí)行 foo 都會(huì)去這樣遍歷objc_method_list,這樣也并合理簸淀。那又是怎么做的呢瓶蝴?那就是objc_class中的另一個(gè)重要成員objc_cache 。它會(huì)把調(diào)用過(guò)的函數(shù)緩存下來(lái)租幕。在找到 foo 之后舷手,把 foo 的method_name作為 key ,method_imp作為 value 存起來(lái)了令蛉。當(dāng)再次收到 foo 消息時(shí)聚霜,就可以直接在 cache 里面找到狡恬,避免去遍歷objc_method_list,從而大大的提高函數(shù)查詢的效率蝎宇。

Objective-C 中給一個(gè)對(duì)象發(fā)送消息會(huì)經(jīng)過(guò)以下幾個(gè)步驟:

  1. 在對(duì)象類的 dispatch table 中嘗試找到該消息弟劲。如果找到了,跳到相應(yīng)的函數(shù)IMP中執(zhí)行代碼姥芥;
  2. 如果沒(méi)找到兔乞,Runtime 會(huì)發(fā)送+resolveInstanceMethod: (實(shí)例方法) 或者resolveClassMethod: (類方法) 嘗試去 resolve (解決) 這個(gè)消息;
  3. 如果 resolve 方法返回NO凉唐,Runtime 就會(huì)發(fā)送-forwardingTargetForSelector:允許你把這個(gè)消息轉(zhuǎn)發(fā)給另外一個(gè)對(duì)象庸追;
  4. 如果沒(méi)新的目標(biāo)對(duì)象返回,Runtime 就會(huì)發(fā)送-methodSignatureForSelector:-forwardInvocation:消息台囱。你可以發(fā)送-invokeWithTarget:消息來(lái)手動(dòng)轉(zhuǎn)發(fā)消息或者發(fā)送-doesNotRecognizeSelector:拋出異常淡溯。

摘自Objective-C Runtime

2017-03-24:

對(duì)于OC中的類來(lái)說(shuō),在runtime中會(huì)有兩個(gè)方法被調(diào)用:

+load
+initialize
這兩個(gè)方法看起來(lái)都是在類初始的時(shí)候調(diào)用的簿训,但其實(shí)還是有一些異同咱娶,從而可以用來(lái)做一些行為。

+load

首先强品,load方法是一定會(huì)在runtime中被調(diào)用的膘侮,只要類被添加到runtime中了,就會(huì)調(diào)用load方法的榛,所以我們可以自己實(shí)現(xiàn)laod方法來(lái)在這個(gè)時(shí)候執(zhí)行一些行為琼了。

而且有意思的一點(diǎn)是,load方法不會(huì)覆蓋夫晌。也就是說(shuō)雕薪,如果子類實(shí)現(xiàn)了load方法,那么會(huì)先調(diào)用父類的load方法慷丽,然后又去執(zhí)行子類的load方法蹦哼。同樣的鳄哭,如果分類實(shí)現(xiàn)了load方法要糊,也會(huì)先執(zhí)行主類的load方法,然后又會(huì)去執(zhí)行分類的load方法妆丘。所以父類的load會(huì)執(zhí)行很多次锄俄,這一點(diǎn)需要注意。而且執(zhí)行順序是 類 -> 子類 ->分類勺拣。而不同類之間的順序不一定奶赠。

+initialize

與load不同的是,initialize方法不一定會(huì)執(zhí)行药有。只有當(dāng)一個(gè)類第一次被發(fā)送消息的時(shí)候會(huì)執(zhí)行毅戈,注意是第一次苹丸。什么叫發(fā)送消息呢,就是執(zhí)行類的一些方法的時(shí)候苇经。也就是說(shuō)這個(gè)方法是懶加載赘理,沒(méi)有用到這個(gè)類就不會(huì)調(diào)用,可以節(jié)省系統(tǒng)資源扇单。

還有一點(diǎn)截然相反商模,卻更符合我們預(yù)期的就是,initialize方法會(huì)覆蓋蜘澜。也就是說(shuō)如果子類實(shí)現(xiàn)了initialize方法施流,就不會(huì)執(zhí)行父類的了,直接執(zhí)行子類本身的鄙信。如果分類實(shí)現(xiàn)了initialize方法瞪醋,也不會(huì)再執(zhí)行主類的。所以initialize方法的執(zhí)行覆蓋順序是 分類 -> 子類 ->類装诡。且只會(huì)有一個(gè)initialize方法被執(zhí)行趟章。

摘自OC中l(wèi)oad方法和initialize方法的異同

2017-03-15:

一個(gè)拓展,獲取任意ViewController的navigationController

@implementation UIViewController (IMYPublic)
- (UINavigationController*)imy_navigationController {
    UINavigationController* nav = nil;    
    if ([self isKindOfClass:[UINavigationController class]]) {
        nav = (id)self;
    }  
    else {        
        if ([self isKindOfClass:[UITabBarController class]]) {
            nav = [((UITabBarController*)self).selectedViewController imy_navigationController];
        }  
        else {
            nav = self.navigationController;
        }
    }   
    return nav;
}
@end

摘自CocoChina

2017-07-04

為什么IBOutlet屬性是weak的慎王?

因?yàn)楫?dāng)我們將控件拖到Storyboard上蚓土,相當(dāng)于新創(chuàng)建了一個(gè)對(duì)象,而這個(gè)對(duì)象是加到視圖控制器的view上赖淤,view有一個(gè)subViews屬性蜀漆,這個(gè)屬性是一個(gè)數(shù)組,里面是這個(gè)view的所有子view咱旱,而我們加的控件就位于這個(gè)數(shù)組中确丢,那么說(shuō)明,實(shí)際上我們的控件對(duì)象是屬于view的吐限,也就是說(shuō)view對(duì)加到它上面的控件是強(qiáng)引用鲜侥。當(dāng)我們使用Outlet屬性的時(shí)候,我們是在viewController里面使用诸典,而這個(gè)Outlet屬性是有view來(lái)進(jìn)行強(qiáng)引用的描函,我們?cè)趘iewController里面僅僅是對(duì)其使用,并沒(méi)有必要擁有它狐粱,所以是weak的

2017-07-06

weakSelf和strongSelf

weakSelf 是為了block不持有self舀寓,避免Retain Circle循環(huán)引用。在 Block 內(nèi)如果需要訪問(wèn) self 的方法肌蜻、變量互墓,建議使用 weakSelf。

strongSelf的目的是因?yàn)橐坏┻M(jìn)入block執(zhí)行蒋搜,假設(shè)不允許self在這個(gè)執(zhí)行過(guò)程中釋放篡撵,就需要加入strongSelf判莉。block執(zhí)行完后這個(gè)strongSelf 會(huì)自動(dòng)釋放,沒(méi)有不會(huì)存在循環(huán)引用問(wèn)題育谬。如果在 Block 內(nèi)需要多次 訪問(wèn) self骂租,則需要使用 strongSelf

摘自深入研究Block用weakSelf、strongSelf斑司、@weakify渗饮、@strongify解決循環(huán)引用

2017-07-31

block的生命周期?

block是一個(gè)對(duì)象宿刮,它的生命周期很簡(jiǎn)單互站,只要看持有block的對(duì)象是不是也被block持有。如果沒(méi)有持有僵缺,就不用擔(dān)心循環(huán)引用的問(wèn)題胡桃。

如何解決blcok產(chǎn)生的循環(huán)引用?

可以用__weak(ARC)__block(MRC)來(lái)解決磕潮。

block對(duì)于參數(shù)形式傳進(jìn)來(lái)的對(duì)象翠胰,會(huì)不會(huì)強(qiáng)引用?

其實(shí)block與函數(shù)一樣自脯,對(duì)于傳進(jìn)來(lái)的參數(shù)之景,并不會(huì)持有。

摘自讓我們來(lái)深入淺出block吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膏潮,一起剝皮案震驚了整個(gè)濱河市锻狗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焕参,老刑警劉巖轻纪,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叠纷,居然都是意外死亡刻帚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門涩嚣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)崇众,“玉大人,你說(shuō)我怎么就攤上這事缓艳⌒DΓ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵阶淘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我互妓,道長(zhǎng)溪窒,這世上最難降的妖魔是什么坤塞? 我笑而不...
    開(kāi)封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮澈蚌,結(jié)果婚禮上摹芙,老公的妹妹穿的比我還像新娘。我一直安慰自己宛瞄,他們只是感情好浮禾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著份汗,像睡著了一般盈电。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杯活,一...
    開(kāi)封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天匆帚,我揣著相機(jī)與錄音,去河邊找鬼旁钧。 笑死吸重,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的歪今。 我是一名探鬼主播嚎幸,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼寄猩!你這毒婦竟也來(lái)了鞭铆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤焦影,失蹤者是張志新(化名)和其女友劉穎车遂,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體斯辰,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舶担,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彬呻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片您炉。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖务嫡,靈堂內(nèi)的尸體忽然破棺而出货抄,到底是詐尸還是另有隱情,我是刑警寧澤蒲跨,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布译断,位于F島的核電站,受9級(jí)特大地震影響或悲,放射性物質(zhì)發(fā)生泄漏孙咪。R本人自食惡果不足惜堪唐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翎蹈。 院中可真熱鬧淮菠,春花似錦、人聲如沸荤堪。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)澄阳。三九已至拥知,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寇荧,已是汗流浹背举庶。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揩抡,地道東北人户侥。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像峦嗤,于是被迫代替她去往敵國(guó)和親蕊唐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉烁设,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,721評(píng)論 0 9
  • 1.@property 后面可以有哪些修飾符 第一種:控制set方法的內(nèi)存管理:retain strong ass...
    allen852閱讀 543評(píng)論 0 0
  • 說(shuō)明:面試題來(lái)源是微博@我就叫Sunny怎么了的這篇博文:《招聘一個(gè)靠譜的 iOS》替梨,其中共55題,除第一題為糾錯(cuò)...
    __Lex閱讀 699評(píng)論 0 4
  • 《黎明有你》 -- 杏子 你別懼怕黑夜装黑, 黑夜之后副瀑, 有更可怕的黑洞。 你別賭注陽(yáng)光恋谭, 陽(yáng)光也會(huì)反噬你愛(ài)的藍(lán)天糠睡。 ...
    一種缺陷ing閱讀 177評(píng)論 2 3
  • 校區(qū):科學(xué)創(chuàng)想樂(lè)高機(jī)器人和平校區(qū) 時(shí)間:周日10:00-12:00 學(xué)員:孟令軒 任教老師:楊玲 教學(xué)目標(biāo): 1....
    Happy00閱讀 1,029評(píng)論 0 0