iOS高級(jí)面試

1、修飾屬性有哪幾個(gè)情萤?追問(wèn) 為什么用copy鸭蛙?weak對(duì)象為nil的底層原理?
2筋岛、block是什么娶视?block有幾種?追問(wèn) 為什么__block修飾的值在內(nèi)部可以改變
3睁宰、字典大致實(shí)現(xiàn)原理
4肪获、一般開(kāi)始做一個(gè)項(xiàng)目,你的架構(gòu)是如何思考的勋陪?
5、runLoop機(jī)制硫兰?source0是什么诅愚?source1是什么?追問(wèn) 事件響應(yīng)時(shí)怎么通知runLoop的劫映?
6违孝、runtime是什么?superclass是什么類(lèi)型的泳赋?math_list里有什么雌桑?追問(wèn)SEL里面有什么(知道的請(qǐng)告訴我,查資料沒(méi)找到)祖今?
7校坑、objc_class結(jié)構(gòu)體
一拣技、類(lèi)在OC中是objc_class的結(jié)構(gòu)體指針 typedef struct objc_class *Class;
在objc/runtime.h中objc_class結(jié)構(gòu)體的定義如下:

        Class isa  OBJC_ISA_AVAILABILITY;
        #if !__OBJC2__
        Class super_class                       OBJC2_UNAVAILABLE;  // 父類(lèi)
        const char *name                        OBJC2_UNAVAILABLE;  // 類(lèi)名
        long version                                OBJC2_UNAVAILABLE;  // 類(lèi)的版本信息,默認(rèn)為0
        long info                                      OBJC2_UNAVAILABLE;  // 類(lèi)信息耍目,供運(yùn)行期使用的一些位標(biāo)識(shí)
        long instance_size                      OBJC2_UNAVAILABLE;  // 該類(lèi)的實(shí)例變量大小
        struct objc_ivar_list *ivars           OBJC2_UNAVAILABLE;  // 該類(lèi)的成員變量鏈表
        struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  // 方法定義的鏈表
        struct objc_cache *cache                       OBJC2_UNAVAILABLE;  // 方法緩存
        struct objc_protocol_list *protocols        OBJC2_UNAVAILABLE;  // 協(xié)議鏈表
        #endif
} OBJC2_UNAVAILABLE;

isa: 指向元類(lèi)的objc_class結(jié)構(gòu)體指針膏斤,iOS中的類(lèi)也是對(duì)象,元類(lèi)中儲(chǔ)存有類(lèi)對(duì)象的類(lèi)方法邪驮;
superclass: 指向父類(lèi)的objc_class結(jié)構(gòu)體指針莫辨,可以通過(guò)父類(lèi)的指針找到變量和方法萎羔;
name: 類(lèi)名赡茸;
version: 版本號(hào)更振,默認(rèn)為0
info: 其他信息康愤,運(yùn)行期間的一些位標(biāo)示
instance_size:類(lèi)實(shí)例變量大小

objc_class的定義

我們?cè)谑褂胷untime以class為前綴的方法時(shí)主要就是針對(duì)這個(gè)結(jié)構(gòu)體中的各個(gè)字段的顶燕。

指向元類(lèi)的指針(isa)

在OC中所有的類(lèi)其實(shí)也是一個(gè)對(duì)象贮匕,那么這個(gè)對(duì)象也會(huì)有一個(gè)所屬的類(lèi)笼裳,這個(gè)類(lèi)就是元類(lèi)也就是結(jié)構(gòu)體里面isa指針?biāo)傅念?lèi)糕珊。

7磷斧、那什么是元類(lèi)呢?
元類(lèi)的定義:元類(lèi)就是類(lèi)對(duì)象的類(lèi)弛饭。每個(gè)類(lèi)都有自己的元類(lèi),因?yàn)槊總€(gè)類(lèi)都有自己獨(dú)一無(wú)二的方法档桃。
簡(jiǎn)單點(diǎn)說(shuō)就是:
當(dāng)你給對(duì)象發(fā)送消息時(shí)憔晒,消息是在尋找這個(gè)對(duì)象的類(lèi)的方法列表拒担。(實(shí)例方法)
當(dāng)你給類(lèi)發(fā)消息時(shí),消息是在尋找這個(gè)類(lèi)的元類(lèi)的方法列表州弟。(類(lèi)方法)

那元類(lèi)的類(lèi)是什么呢婆翔?
元類(lèi)掏婶,就像之前的類(lèi)一樣,它也是一個(gè)對(duì)象最蕾。你也可以調(diào)用它的方法。自然的誓沸,這就意味著他必須也有一個(gè)類(lèi)壹粟。

所有的元類(lèi)都使用根元類(lèi)(繼承體系中處于頂端的類(lèi)的元類(lèi))作為他們的類(lèi)趁仙。這就意味著所有NSObject的子類(lèi)(大多數(shù)類(lèi))的元類(lèi)都會(huì)以NSObject的元類(lèi)作為他們的類(lèi)

根據(jù)這個(gè)規(guī)則,所有的元類(lèi)使用根元類(lèi)作為他們的類(lèi)干奢,根元類(lèi)的元類(lèi)則就是它自己忿峻。也就是說(shuō)基類(lèi)的元類(lèi)的isa指針指向他自己逛尚。

這里有一副圖可以很好的展現(xiàn)這些關(guān)系:


20170630090350207.jpeg

8刁愿、category是啥铣口?category為什么不能添加屬性?有辦法解決嗎件缸?
//Category表示一個(gè)結(jié)構(gòu)體指針的類(lèi)型

typedef struct objc_category *Category;
struct objc_category {
    char * _Nonnull category_name                            OBJC2_UNAVAILABLE;
    char * _Nonnull class_name                               OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable instance_methods     OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable class_methods        OBJC2_UNAVAILABLE;
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
}                                                            OBJC2_UNAVAILABLE;

分類(lèi)特點(diǎn)
1.分類(lèi)是用于給原有類(lèi)添加方法的,因?yàn)榉诸?lèi)的結(jié)構(gòu)體指針中他炊,沒(méi)有屬性列表佑稠,只有方法列表旗芬。原則上講它只能添加方法, 不能添加屬性(成員變量),實(shí)際上可以通過(guò)其它方式添加屬性 ;
2.分類(lèi)中的可以寫(xiě)@property, 但不會(huì)生成setter/getter方法, 也不會(huì)生成實(shí)現(xiàn)以及私有的成員變量疮丛,會(huì)編譯通過(guò),但是引用變量會(huì)報(bào)錯(cuò);
3.如果分類(lèi)中有和原有類(lèi)同名的方法, 會(huì)優(yōu)先調(diào)用分類(lèi)中的方法, 就是說(shuō)會(huì)忽略原有類(lèi)的方法誊薄,同名方法調(diào)用的優(yōu)先級(jí)為 分類(lèi) > 本類(lèi) > 父類(lèi)呢蔫;

可以通過(guò)關(guān)聯(lián)對(duì)象給Category添加屬性

@interface NSObject (Extension)
@property (nonatomic,copy  ) NSString *name;
@end
@implementation NSObject (Extension)
- (void)setName:(NSString *)name {
    objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name {
    return objc_getAssociatedObject(self,@selector(name));
}

@end

上面是把我們看到的現(xiàn)象進(jìn)行分析片吊,思考其為什么會(huì)有這樣的現(xiàn)象呢?分類(lèi)并不會(huì)改變?cè)蓄?lèi)的內(nèi)存分布的情況全谤,它是在運(yùn)行期間決定的认然,此時(shí)內(nèi)存的分布已經(jīng)確定卷员,若此時(shí)再添加實(shí)例會(huì)改變內(nèi)存的分布情況卷胯,這對(duì)編譯性語(yǔ)言是災(zāi)難,是不允許的挺峡。

9橱赠、如果一個(gè)類(lèi)有兩個(gè)相同的分類(lèi)箫津,系統(tǒng)會(huì)調(diào)用哪個(gè)分類(lèi)的方法苏遥?
10、KVO怎么實(shí)現(xiàn)师抄,_會(huì)不會(huì)觸發(fā)教硫,成員變量會(huì)不會(huì)觸發(fā),kvc+成員變量會(huì)不會(huì)觸發(fā)茶鉴,不用setter怎么觸發(fā)kvo
答. 當(dāng)一個(gè)對(duì)象使用了KVO監(jiān)聽(tīng),iOS系統(tǒng)會(huì)修改這個(gè)對(duì)象的isa指針惭蹂,
改為指向一個(gè)全新的通過(guò)Runtime動(dòng)態(tài)創(chuàng)建的子類(lèi)剿干,子類(lèi)擁有自己的set方法實(shí)現(xiàn)穆刻,
set方法實(shí)現(xiàn)內(nèi)部會(huì)順序調(diào)用willChangeValueForKey方法氢伟、原來(lái)的setter方法實(shí)現(xiàn)朵锣、
didChangeValueForKey方法,而didChangeValueForKey方法內(nèi)部
又會(huì)調(diào)用監(jiān)聽(tīng)器的observeValueForKeyPath:ofObject:change:context:監(jiān)聽(tīng)方法飞傀。

如何手動(dòng)觸發(fā)KVO
答. 被監(jiān)聽(tīng)的屬性的值被修改時(shí)砸烦,就會(huì)自動(dòng)觸發(fā)KVO幢痘。
如果想要手動(dòng)觸發(fā)KVO颜说,則需要我們自己調(diào)用willChangeValueForKey和
didChangeValueForKey方法即可在不改變屬性值的情況下手動(dòng)觸發(fā)KVO
门粪,并且這兩個(gè)方法缺一不可玄妈。

11、iOS反射機(jī)制?
12瞭郑、iOS的timer和CADisplay的區(qū)別鸭你?
13袱巨、用過(guò) TableView 嗎愉老,平時(shí)怎么解決 TableView 滑動(dòng)卡頓問(wèn)題的?
14焰盗、談?wù)剬?duì)多線程的使用和理解咒林?
15、項(xiàng)目中遇到過(guò)abort()嗎澎粟?如何定位和解決abort()活烙?

備用:
iOS有哪幾種鎖瓣颅?比較各種鎖的優(yōu)缺點(diǎn)宫补?并給出實(shí)例場(chǎng)景判斷用哪種鎖

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抒巢,隨后出現(xiàn)的幾起案子稚晚,更是在濱河造成了極大的恐慌,老刑警劉巖客燕,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸳劳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡也搓,警方通過(guò)查閱死者的電腦和手機(jī)赏廓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)傍妒,“玉大人幔摸,你說(shuō)我怎么就攤上這事〔罚” “怎么了既忆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嗦玖。 經(jīng)常有香客問(wèn)我尿贫,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任衰齐,我火速辦了婚禮废酷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘睹簇。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著翰绊,像睡著了一般抡谐。 火紅的嫁衣襯著肌膚如雪免胃。 梳的紋絲不亂的頭發(fā)上躺涝,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼蜈敢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼姚建,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼考婴!你這毒婦竟也來(lái)了考杉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沐兰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了展箱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辈末,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情准脂,我是刑警寧澤湾戳,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響谍失,放射性物質(zhì)發(fā)生泄漏柒莉。R本人自食惡果不足惜闻坚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兢孝。 院中可真熱鬧窿凤,春花似錦仅偎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至夯秃,卻和暖如春座咆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仓洼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工介陶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人色建。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓哺呜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親箕戳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子某残,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 面向?qū)ο蟮娜筇匦裕悍庋b、繼承陵吸、多態(tài) OC內(nèi)存管理 _strong 引用計(jì)數(shù)器來(lái)控制對(duì)象的生命周期玻墅。 _weak...
    運(yùn)氣不夠技術(shù)湊閱讀 1,085評(píng)論 0 10
  • 一千個(gè)讀者眼中有一千個(gè)哈姆雷特,一千名 iOS 程序員心目中就有一千套 iOS 高級(jí)面試題走越。本文就是筆者認(rèn)為可以用...
    iOS弗森科閱讀 1,427評(píng)論 0 13
  • 題目: 出處:先是程序員椭豫,然后才是iOS程序員 — 寫(xiě)給廣大非科班iOS開(kāi)發(fā)者的一篇面試總結(jié)如果讓你實(shí)現(xiàn)屬性的we...
    林大鵬閱讀 1,153評(píng)論 0 13
  • 文/西風(fēng)雨冥 我看著咖啡店里的裝潢耻瑟, 竟浮現(xiàn)出中世紀(jì)的模樣旨指。 書(shū)架上一本深?yuàn)W的書(shū) 勾引我去閱讀。 可突然想到喳整, 倘...
    西風(fēng)雨冥閱讀 159評(píng)論 0 4
  • 感賞我能夠轉(zhuǎn)化負(fù)能量谆构,感賞我不和老公對(duì)抗,感賞我時(shí)時(shí)提醒自己不聚焦在負(fù)面上框都,感賞我接納孩子的現(xiàn)狀搬素,并且接納孩子的現(xiàn)...
    一切隨緣666閱讀 191評(píng)論 0 4