作為iOS開發(fā),這道面試題你能答出來,說明你基礎(chǔ)很OK!

首先我們先來看一下這道面試題是啥?


題目看著非常簡(jiǎn)單,我是先創(chuàng)建了一個(gè)繼承NSObject的GDPerson類;

GDPerson類的.h文件

GDPerson類的.m文件

再看一下我們viewController.m里面的代碼:

作為一個(gè)開發(fā)者,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要崇猫,這是一個(gè)我的iOS開發(fā)交流群:130 595 548诅炉,不管你是小白還是大牛都?xì)g迎入駐 贴谎,讓我們一起進(jìn)步,共同發(fā)展3浩恰(群內(nèi)會(huì)免費(fèi)提供一些群主收藏的免費(fèi)學(xué)習(xí)書籍資料以及整理好的幾百道面試題和答案文檔V亵帷)

這是題目

請(qǐng)問:

1.print能不能調(diào)用成功?如果不能會(huì)怎么樣?如果能的話調(diào)用結(jié)果是什么?

這個(gè)又是一個(gè)更扯的面試題,真正開發(fā)的時(shí)候,誰也不會(huì)這么寫,這個(gè)還是主要考你基礎(chǔ)!相信你看到這個(gè)題目之后應(yīng)該心中已經(jīng)有了答案,要不知道結(jié)果,要么可能知道結(jié)果,要么猶豫不決,要么不知道哈哈!

其實(shí)這個(gè)面試題考點(diǎn)比較多,考點(diǎn)如下:

1.你要了解super的本質(zhì),第一個(gè)參數(shù)要傳結(jié)構(gòu)體

2.函數(shù)的堆棧分配問題

3.消息機(jī)制,調(diào)用方法是怎么調(diào)用

4.訪問成員變量的本質(zhì)

這樣,我們先來看一下調(diào)用結(jié)果吧!

請(qǐng)看結(jié)果:

面試題運(yùn)用結(jié)果

這里跟你想的答案一樣嗎?

這樣我在cls前面加一段代碼,我們?cè)倏匆幌陆Y(jié)果:

面試題運(yùn)用結(jié)果

首先我們立刻會(huì)有2個(gè)疑問:

1.為什么能調(diào)用成功?

2.為什么self.name調(diào)用結(jié)果是viewController?

一.為什么能調(diào)用成功?

[(__bridge id)obj print];由之前的學(xué)習(xí),我們知道這個(gè)代碼的本質(zhì)是:給obj發(fā)一條print的消息,就會(huì)去通過obj的isa找到obj的類對(duì)象,去找方法列表,這個(gè)是非常清楚的.這個(gè)能調(diào)用成功,說明(__bridge id)obj也存在我們之前說的是isa指針這個(gè)東西

我畫個(gè)圖,這樣理解的比較清楚.

cls是指向GDPerson,obj是指向cls,所以圖如下:

上面綠色是[GDPerson class],圖比較模糊

再請(qǐng)看下面的代碼:

person指向GDPerson的實(shí)例變量,而GDPerson的實(shí)例變量是包括isa和成員變量等等,這個(gè)也很清楚.而isa是指向GDPerson的類對(duì)象,所以請(qǐng)看下面的圖:

我們根據(jù)之前的源碼分析知道,isa和_name是存在一個(gè)結(jié)構(gòu)體,而對(duì)于結(jié)構(gòu)體來說,第一個(gè)成員變量的地址值就是這個(gè)結(jié)構(gòu)體的地址.所以person就是指向isa.

好了,這兩個(gè)圖我們分析清楚了以后,你看這兩個(gè)圖是不是很類似,幾乎是一樣的,我們?cè)倏聪旅娴囊粋€(gè)圖:

上面綠色是[GDPerson class],圖比較模糊

所以從上面的結(jié)構(gòu)上,你看是不是就是一樣的,obj就相當(dāng)于person,所以能調(diào)用,這個(gè)比較抽象.說白了,你上面寫的cls就是isa作用,因?yàn)槲覀冎乐赶蝾悓?duì)象的指針就是isa.isa就是存儲(chǔ)類對(duì)象的地址值.而你可能有疑問cls里面都沒有_name怎么能算是GDPerson對(duì)象呢?注意,我們是調(diào)用print方法,調(diào)用方法沒有說一定有_name成員變量!是這樣吧!它是跟有沒有成員變量是沒有關(guān)系的.

第二個(gè)角度解釋:obj怎么找到cls,就是通過cls對(duì)象的前8個(gè)字節(jié)的內(nèi)存地址找到它,前8個(gè)字節(jié)也是結(jié)構(gòu)體的地址,通過地址就能很容易找到class對(duì)象,是這樣的.所以它能夠調(diào)用成功!這就是調(diào)用的本質(zhì),后面那條線的調(diào)用也是如此.

二.為什么self.name調(diào)用結(jié)果是其他的?

首先你要知道堆棧排列的知識(shí)點(diǎn),請(qǐng)看下圖:

這些變量都是存在椕堤常空間的,而且內(nèi)存地址是由高地址到底地址.

好我們?cè)倏聪旅孢@個(gè)之前的圖:

我們畫一下這些地址排列如下

上面代碼的結(jié)構(gòu)示意圖

上面綠色是[GDPerson class],圖比較模糊,這個(gè)圖很清楚.

現(xiàn)在我們來回憶一下:之前我們定義一個(gè)對(duì)象,比如上面的GDPerson這個(gè)類,它的底層生成的結(jié)構(gòu)是下面這個(gè)樣子的

structGDPerson_IMPL

{

Class isa;

NSString *_name;

}

上面這個(gè)結(jié)構(gòu)體就是底層的結(jié)構(gòu),現(xiàn)在我們想一下,怎么找到_name這個(gè)地址,肯定是找到isa指針的地址加上8個(gè)字節(jié)就能找到_name吧?看下圖

這個(gè)應(yīng)該是很明顯,找name就是通過isa找到name對(duì)應(yīng)的這塊內(nèi)存地址就行了.

現(xiàn)在大家知道下結(jié)果了吧?上面的cls就是我們的isa指針,所以找name就找到了test這里面!好我們?cè)龠\(yùn)行一下看看

這里你定義test,你定義任何其他的都是一樣,都會(huì)找到cls前面聲明的變量.比如我再定義一個(gè)objct再看下.

輸出的結(jié)果就是cls上面最近的一個(gè)創(chuàng)建的.還有一個(gè)未解決就是self.name調(diào)用結(jié)果是viewController

三伐憾、為什么self.name調(diào)用結(jié)果是viewController?

我們把test變量去掉,結(jié)果就會(huì)是viewController 我直接說了這個(gè)主要是[super viewDidLoad]影響;從上一張博客我們知道

super做了什么事它底層是這樣實(shí)現(xiàn)的(上個(gè)博客說得很清楚): objc_msgSendSuper({ self,[UIViewController Class]} ,@selector(viewDidLoad));其他就是做了這件事@selector(viewDidLoad)也可以寫出sel_registerName("viewDidLoad")

這個(gè)肯定要開始定義一個(gè)局部的結(jié)構(gòu)體才能傳入 objc_msgSendSuper這個(gè)方法.所以最高地址是abc這個(gè)結(jié)構(gòu)體,而結(jié)構(gòu)體的第一個(gè)參數(shù)的地址就是結(jié)構(gòu)體的地址,所以輸出的就是self也就是viewController.

如下圖:

就會(huì)找到self

下面我們通過內(nèi)存來證明一下這個(gè)東西:

這個(gè)題目涉及的知識(shí)點(diǎn)還是比較多,如果直接給你題目憑空想想,還是很難想出答案,好了,就說這么多了

如果覺得我寫得對(duì)您有所幫助,請(qǐng)點(diǎn)贊關(guān)注瀑罗,我會(huì)持續(xù)更新??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斩祭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子停忿,更是在濱河造成了極大的恐慌,老刑警劉巖吮铭,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谓晌,死亡現(xiàn)場(chǎng)離奇詭異癞揉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)喊熟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門芥牌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谬俄,你說我怎么就攤上這事弃理。” “怎么了痘昌?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)算灸。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么街佑? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮森逮,結(jié)果婚禮上磁携,老公的妹妹穿的比我還像新娘。我一直安慰自己谊迄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布歪脏。 她就那樣靜靜地躺著粮呢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪豪硅。 梳的紋絲不亂的頭發(fā)上挺物,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天姻乓,我揣著相機(jī)與錄音,去河邊找鬼蹋岩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秧骑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乎折,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼骂澄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了磨镶?” 一聲冷哼從身側(cè)響起健提,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脐嫂,沒想到半個(gè)月后紊遵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕊爵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年桦山,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片会放。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钉凌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矢沿,到底是詐尸還是另有隱情酸纲,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布栽惶,位于F島的核電站,受9級(jí)特大地震影響冕象,放射性物質(zhì)發(fā)生泄漏汁蝶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一席爽、第九天 我趴在偏房一處隱蔽的房頂上張望啊片。 院中可真熱鬧玖像,春花似錦、人聲如沸捐寥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乡洼。三九已至,卻和暖如春拔稳,著一層夾襖步出監(jiān)牢的瞬間锹雏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工轻绞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佣耐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓稼病,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親然走。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

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