2021最新iOS面試題總結(jié)(答案篇)

關(guān)于面試題

打個(gè)比方寒锚,如果把找工作理解成考大學(xué)劫映,面試就是高考,市面上的“真題”就是模擬試卷刹前。我們會(huì)很容易傾向于在面試前尋找對(duì)應(yīng)公司的面試“真題”泳赋,重點(diǎn)準(zhǔn)備,期待“押題”成功喇喉。但實(shí)際上祖今,即使面試同一家公司,它會(huì)有不同部門(mén)轧飞,不同業(yè)務(wù)線(xiàn)衅鹿,不同面試官,即使遇到同一面試官过咬,他也不一定就每次考察完全一樣的內(nèi)容大渤。想想高考中那些考的好的同學(xué),他們肯定不是靠“押題”才能取得好成績(jī)吧掸绞,他們大多靠的是平常積累及對(duì)知識(shí)點(diǎn)靈活掌握泵三,那面試也一樣啊。執(zhí)著于搜題衔掸,把面試題當(dāng)做重點(diǎn)進(jìn)行“復(fù)習(xí)”烫幕,還不如自己劃出“考綱”,各個(gè)知識(shí)點(diǎn)逐一檢查掌握情況敞映,復(fù)習(xí)的更全面呢较曼。

我對(duì)于面試題的看法一直是相對(duì)保守的,這類(lèi)文章一般只是內(nèi)容搬運(yùn)振愿,它會(huì)存在一些偏差和誤讀捷犹,最重要的那就是幾道題往那一扔弛饭,并沒(méi)有產(chǎn)出有價(jià)值的東西。這也是為什么我上篇面試總結(jié)萍歉,會(huì)加了一些面試技巧侣颂,整理面試題時(shí),也沒(méi)提他們是出自哪家公司枪孩,就是不希望大家把題目區(qū)別看待憔晒。

說(shuō)了這些并不是說(shuō)面試題沒(méi)用啊,而是希望大家不要迷信面試題蔑舞,更多地去關(guān)注那些有質(zhì)量有深度的技術(shù)文章拒担。面試考核的是知識(shí)點(diǎn)而不是具體的某些題目,面試題的作用在于斗幼,衡量我們的知識(shí)掌握情況澎蛛,便于我們查漏補(bǔ)缺抚垄,越說(shuō)越像是針對(duì)一次“考試”了 蜕窿。

總結(jié)不易,希望這份參考答案能對(duì)你有所幫助呆馁,如果想持續(xù)關(guān)注我桐经,歡迎訂閱vx公眾號(hào):EVE實(shí)驗(yàn)室。

面試題及參考答案

Swift

1浙滤、Swift中struct和class有什么區(qū)別阴挣?

struct是值引用,更輕量纺腊,存放于棧區(qū)畔咧,class是類(lèi)型引用,存放于堆區(qū)揖膜。struct無(wú)法繼承誓沸,class可繼承。

2壹粟、Swift中的方法調(diào)用有哪些形式拜隧?

答:直接派發(fā)、函數(shù)表派發(fā)趁仙、消息機(jī)制派發(fā)洪添。派發(fā)方式受聲明位置,引用類(lèi)型雀费,特定行為的影響干奢。為什么Swift有這么多派發(fā)形式?為了效率盏袄。

參考文章:深入理解 Swift 派發(fā)機(jī)制

3忿峻、Swift和OC有什么區(qū)別宋光?

Swift和OC的區(qū)別有很多,這里簡(jiǎn)要總結(jié)這幾條:

4炭菌、從OC向Swift遷移的時(shí)候遇到過(guò)什么問(wèn)題罪佳?

可以參考這篇文章:OC項(xiàng)目轉(zhuǎn)Swift指南?里的混編注意事項(xiàng)。

5黑低、怎么理解面向協(xié)議編程赘艳?

面向?qū)ο笫且詫?duì)象的視角觀(guān)察整體結(jié)構(gòu),萬(wàn)物皆為對(duì)象克握。

面向協(xié)議則是用協(xié)議的方式組織各個(gè)類(lèi)的關(guān)系蕾管,Swift底層幾乎所有類(lèi)都構(gòu)建在協(xié)議之上。

面向協(xié)議能夠解決面向?qū)ο蟮牧庑卫^承菩暗,橫切關(guān)注點(diǎn)和動(dòng)態(tài)派發(fā)的安全性等問(wèn)題掰曾。

參考喵神的面向協(xié)議編程與 Cocoa 的邂逅 (上)

OC語(yǔ)法

1、Block是如何實(shí)現(xiàn)的停团?Block對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)是什么樣子的旷坦?__block的作用是什么?它對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)又是什么樣子的佑稠?

block本質(zhì)是一個(gè)對(duì)象秒梅,底層用struct實(shí)現(xiàn)。

數(shù)據(jù)結(jié)構(gòu)如下:

struct Block_descriptor {

? ? unsigned long int reserved;

? ? unsigned long int size;

? ? void (*copy)(void *dst, void *src);

? ? void (*dispose)(void *);

};

struct Block_layout {

? ? void *isa;

? ? int flags;

? ? int reserved;

? ? void (*invoke)(void *, ...);

? ? struct Block_descriptor *descriptor;

? ? /* Imported variables. */

};

isa 指針舌胶,所有對(duì)象都有該指針捆蜀,用于實(shí)現(xiàn)對(duì)象相關(guān)的功能。

flags幔嫂,用于按 bit 位表示一些 block 的附加信息辆它,本文后面介紹 block copy 的實(shí)現(xiàn)代碼可以看到對(duì)該變量的使用。

reserved履恩,保留變量锰茉。

invoke,函數(shù)指針似袁,指向具體的 block 實(shí)現(xiàn)的函數(shù)調(diào)用地址洞辣。

descriptor, 表示該 block 的附加描述信息昙衅,主要是 size 大小扬霜,以及 copy 和 dispose 函數(shù)的指針。

variables而涉,capture 過(guò)來(lái)的變量著瓶,block 能夠訪(fǎng)問(wèn)它外部的局部變量,就是因?yàn)閷⑦@些變量(或變量的地址)復(fù)制到了結(jié)構(gòu)體中啼县。

__block的作用是可以獲取對(duì)應(yīng)變量的指針材原,使其可以在block內(nèi)部被修改沸久。通過(guò)反編譯的代碼我們可以看到該對(duì)象是這樣的:

struct __Block_byref_i_0 {

? ? void *__isa;

? ? __Block_byref_i_0 *__forwarding;

? ? int __flags;

? ? int __size;

? ? int val; //變量名

};

對(duì)于block的深入了解,可以參考《Objective-C高級(jí)編程》第二章或者唐巧的這篇談Objective-C block的實(shí)現(xiàn)

2余蟹、GCD中的Block是在堆上還是棧上卷胯?

堆上⊥疲可以通過(guò)block的isa指針確認(rèn)窑睁。

3、NSCoding協(xié)議是干什么用的葵孤?

一種編碼協(xié)議担钮,歸檔時(shí)和解檔時(shí)需要依賴(lài)該協(xié)議定義的編碼和解碼方法。Foundation和Cocoa Touch中的大部分類(lèi)都遵循了這個(gè)協(xié)議尤仍,一般被NSKeyedArchiver做自定義對(duì)象持久化時(shí)使用箫津。

4、KVO的實(shí)現(xiàn)原理

利用Runtime生成一個(gè)中間對(duì)象宰啦,讓原對(duì)象的isa指針指向它苏遥,然后重寫(xiě)setter方法,插入willChangeValueForKey和didChangeValueForKey方法绑莺。當(dāng)屬性變化時(shí)會(huì)調(diào)用暖眼,會(huì)調(diào)用這兩個(gè)方法通知到外界屬性變化。

5纺裁、NSOperation有哪些特性,比著GCD有哪些優(yōu)點(diǎn)司澎,它有哪些API欺缘?

NSOperation是對(duì)GCD的封裝,具有面向?qū)ο蟮奶攸c(diǎn)挤安,可以更方便的進(jìn)行封裝谚殊,可以設(shè)置依賴(lài)關(guān)系。

API可以查看NSOperation文檔蛤铜。

6嫩絮、NSNotificaiton是同步還是異步的,如果發(fā)通知時(shí)在子線(xiàn)程围肥,接收在哪個(gè)線(xiàn)程剿干?

同步。子線(xiàn)程穆刻。

UI

1置尔、事件響應(yīng)鏈?zhǔn)侨绾蝹鬟f的?

手勢(shì)的點(diǎn)擊會(huì)發(fā)生兩個(gè)重要事情氢伟,事件傳遞和事件響應(yīng)榜轿。

事件傳遞:從UIApplication開(kāi)始幽歼,到window,再逐步往下層(子視圖)找谬盐,直到找到最深層的子視圖甸私,其為first responder。用到的判斷方法是pointInside:withEvent和hitTest:withEvent飞傀。

事件響應(yīng):從識(shí)別到的視圖(first responder)開(kāi)始驗(yàn)證能否響應(yīng)事件颠蕴,如果不能就交給其上層(父視圖)視圖,如果能相應(yīng)將不再往下傳遞助析,如果直到找到UIApplication層還沒(méi)有相應(yīng)犀被,那就忽略該次點(diǎn)擊。用到的判斷方法是touchesBegan:withEvent外冀、touchesMoved:withEvent等寡键。

這兩個(gè)過(guò)程大致的相反的。

2雪隧、什么是異步渲染西轩?

異步渲染就是在子線(xiàn)程進(jìn)行繪制,然后拿到主線(xiàn)程顯示脑沿。

UIView的顯示是通過(guò)CALayer實(shí)現(xiàn)的藕畔,CALayer的顯示則是通過(guò)contents進(jìn)行的及舍。異步渲染的實(shí)現(xiàn)原理是當(dāng)我們改變UIView的frame時(shí)勾扭,會(huì)調(diào)用layer的setNeedsDisplay问顷,然后調(diào)用layer的display方法洲守。我們不能在非主線(xiàn)程將內(nèi)容繪制到layer的context上遗契,但我們單獨(dú)開(kāi)一個(gè)子線(xiàn)程通過(guò)CGBitmapContextCreateImage()繪制內(nèi)容而钞,繪制完成之后切回主線(xiàn)程仪壮,將內(nèi)容賦值到contents上蒲稳。

這個(gè)步驟可以參照YYText中YYTextAsyncLayer.m文件中的實(shí)現(xiàn)方式瞭郑。

3辜御、layoutsubviews是在什么時(shí)機(jī)調(diào)用的?

init初始化不會(huì)觸發(fā)屈张。

addSubview時(shí)擒权。

設(shè)置frame且前后值變化,frame為zero且不添加到指定視圖不會(huì)觸發(fā)阁谆。

旋轉(zhuǎn)Screen會(huì)觸發(fā)父視圖的layoutSubviews碳抄。

滾動(dòng)UIScrollView引起View重新布局時(shí)會(huì)觸發(fā)layoutSubviews。

4笛厦、一張圖片的展示經(jīng)歷了哪些步驟纳鼎?

這個(gè)可以參考我之前寫(xiě)的一篇文章iOS開(kāi)發(fā)圖片格式選擇?中的前半部分內(nèi)容。

5、什么是離屏渲染贱鄙,什么情況會(huì)導(dǎo)致離屏渲染劝贸?

如果要在顯示屏上顯示內(nèi)容,我們至少需要一塊與屏幕像素?cái)?shù)據(jù)量一樣大的frame buffer逗宁,作為像素?cái)?shù)據(jù)存儲(chǔ)區(qū)域映九。如果有時(shí)因?yàn)槊媾R一些限制,無(wú)法把渲染結(jié)果直接寫(xiě)入frame buffer瞎颗,而是先暫存在另外的內(nèi)存區(qū)域件甥,之后再寫(xiě)入frame buffer,那么這個(gè)過(guò)程被稱(chēng)之為離屏渲染哼拔。

以陰影為例引有,為什么它會(huì)導(dǎo)致離屏渲染。因?yàn)镚PU的渲染是遵循“畫(huà)家算法”倦逐,一層一層繪制的譬正,但陰影很特殊,它需要全部?jī)?nèi)容繪制完成檬姥,再根據(jù)外輪廓進(jìn)行繪制曾我。這就導(dǎo)致了,陰影這一層要一直占據(jù)一塊內(nèi)存區(qū)域健民,這就導(dǎo)致了離屏渲染抒巢。

類(lèi)似導(dǎo)致離屏渲染的情況還有:

cornerRadius+clipsToBounds

group opacity 組透明度

mask 遮罩

UIBlurEffect 毛玻璃效果

有一篇文章詳細(xì)的討論了這些情況:關(guān)于iOS離屏渲染的深入研究

如果你正在跳槽或者正準(zhǔn)備跳槽不妨動(dòng)動(dòng)小手,添加一下咱們的交流群1 9 5 5 9 4 5 1 7來(lái)獲取一份詳細(xì)的大廠(chǎng)面試資料為你的跳槽多添一份保障秉犹。

6蛉谜、CoreAnimation這個(gè)框架的作用什么,它跟UIKit的關(guān)系是什么凤优?

CoreAnimation雖然直譯是核心動(dòng)畫(huà)悦陋,但它其實(shí)是一個(gè)圖像渲染框架,動(dòng)畫(huà)實(shí)現(xiàn)只是它的一部分功能筑辨。

看這張圖我們可以知道,它是UIKit和AppKit的底層實(shí)現(xiàn)幸逆,位于Metal棍辕、Core Graphics和GPU之上之上。

蘋(píng)果官方文檔:About Core Animation

引用計(jì)數(shù)

1还绘、ARC方案的原理是什么楚昭?它是在什么時(shí)候做的隱式添加release操作?

ARC(Automatic Reference Cunting)自動(dòng)引用計(jì)數(shù)拍顷,意即通過(guò)LLVM編譯器自動(dòng)管理對(duì)應(yīng)的引用計(jì)數(shù)狀態(tài)抚太。ARC開(kāi)啟時(shí)無(wú)需再次鍵入retain或者release代碼。

它是在編譯階段添加retain或者release代碼的。

2尿贫、循環(huán)引用有哪些場(chǎng)景电媳,如何避免?

循環(huán)引用及兩個(gè)及以上對(duì)象出現(xiàn)引用環(huán)庆亡,導(dǎo)致對(duì)象無(wú)法釋放的情況匾乓。一般在block,delegate又谋,NSTimer時(shí)容易出現(xiàn)這個(gè)問(wèn)題拼缝。

解決方案就是讓環(huán)的其中一環(huán)節(jié)實(shí)現(xiàn)弱引用。

3彰亥、為什么當(dāng)我們?cè)谑褂胋lock時(shí)外面是weak 聲明一個(gè)weakSelf咧七,還要在block內(nèi)部使用strong再持有一下?

block外界聲明weak是為了實(shí)現(xiàn)block對(duì)對(duì)象的弱持有任斋,而里面的作用是為了保證在進(jìn)到block時(shí)不會(huì)發(fā)生釋放继阻。

4、Autoreleasepool是實(shí)現(xiàn)機(jī)制是什么仁卷?它是什么時(shí)候釋放內(nèi)部的對(duì)象的穴翩?它內(nèi)部的數(shù)據(jù)結(jié)構(gòu)是什么樣的?當(dāng)我提到哨兵對(duì)象時(shí)锦积,會(huì)繼續(xù)問(wèn)哨兵對(duì)象的作用是什么芒帕,為什么要設(shè)計(jì)它?

Autoreleasepool的原理是一個(gè)雙向列表丰介,它會(huì)對(duì)加入其中的對(duì)象實(shí)現(xiàn)延遲釋放背蟆。當(dāng)Autoreleasepool調(diào)用drain方法時(shí)會(huì)釋放內(nèi)部標(biāo)記為autorelease的對(duì)象。

class AutoreleasePoolPage {

? ? magic_t const magic;

? ? id *next;

? ? pthread_t const thread;

? ? AutoreleasePoolPage * const parent;

? ? AutoreleasePoolPage *child;

? ? uint32_t const depth;

? ? uint32_t hiwat;

};

哨兵對(duì)象類(lèi)似一個(gè)指針哮幢,指向自動(dòng)釋放池的棧頂位置带膀,它的作用就是用于標(biāo)記當(dāng)前自動(dòng)釋放池需要釋放內(nèi)部對(duì)象時(shí),釋放到那個(gè)地方結(jié)束橙垢,每次入棧時(shí)它用于確定添加的位置垛叨,然后再次移動(dòng)到棧頂。

關(guān)于自動(dòng)釋放池的底層探究可以看draveness的這篇自動(dòng)釋放池的前世今生 ---- 深入解析 autoreleasepool

5柜某、哪些對(duì)象會(huì)放入到Autoreleasepool中嗽元?

有兩種情況生成的對(duì)象會(huì)加入到autoreleasepool中:

非alloc/new/copy/mutablecopy 開(kāi)始的方式初始化時(shí)。

id的指針或?qū)ο蟮闹羔樤跊](méi)有顯示指定時(shí)

引用計(jì)數(shù)帶來(lái)的一次討論

6喂击、weak的實(shí)現(xiàn)原理是什么剂癌?當(dāng)引用對(duì)象銷(xiāo)毀是它是如何管理內(nèi)部的Hash表的?(這里要參閱weak源碼)

runTime會(huì)把對(duì)weak修飾的對(duì)象放到一個(gè)全局的哈希表中翰绊,用weak修飾的對(duì)象的內(nèi)存地址為key佩谷,weak指針為值旁壮,在對(duì)象進(jìn)行銷(xiāo)毀時(shí),用通過(guò)自身地址去哈希表中查找到所有指向此對(duì)象的weak指針谐檀,并把所有的weak指針置位nil抡谐。

Runtime

1、消息發(fā)送的流程是怎樣的稚补?

OC中的方法調(diào)用會(huì)轉(zhuǎn)化成給對(duì)象發(fā)送消息童叠,發(fā)送消息會(huì)調(diào)用這個(gè)方法:

objc_msgSend(receiver, @selector(message))

該過(guò)程有以下關(guān)鍵步驟:

先確定調(diào)用方法的類(lèi)已經(jīng)都加載完畢,如果沒(méi)加載完畢的話(huà)進(jìn)行加載

從cache中查找方法

cache中沒(méi)有找到對(duì)應(yīng)的方法课幕,則到方法列表中查厦坛,查到則緩存

如果本類(lèi)中查詢(xún)到?jīng)]有結(jié)果,則遍歷所有父類(lèi)重復(fù)上面的查找過(guò)程乍惊,直到NSObject

2杜秸、關(guān)聯(lián)對(duì)象時(shí)什么情況下會(huì)導(dǎo)致內(nèi)存泄露?

關(guān)聯(lián)對(duì)象可以理解就是持有了一個(gè)對(duì)象润绎,如果是retain等方式的持有撬碟,而該對(duì)象也持有了本類(lèi),那就是導(dǎo)致了循環(huán)引用莉撇。

3呢蛤、消息轉(zhuǎn)發(fā)的流程是什么?

消息轉(zhuǎn)發(fā)是發(fā)生在接收者(receiver)沒(méi)有找到對(duì)應(yīng)的方法(method)的時(shí)候棍郎,該步驟有如下幾個(gè)關(guān)鍵步驟:

消息轉(zhuǎn)發(fā)的時(shí)候其障,如果是實(shí)例方法會(huì)走resolveInstanceMethod:,如果是類(lèi)方法會(huì)走resolveClassMethod:涂佃,它們的返回值都是Bool励翼,需要我們確定是否進(jìn)行轉(zhuǎn)發(fā)。

如果第一步返回YES辜荠,確定轉(zhuǎn)發(fā)就會(huì)進(jìn)到下個(gè)方法forwardingTargetForSelector汽抚,這個(gè)方法需要我們指定一個(gè)被用receiver。

methodSignatureForSelector用于指定方法簽名伯病,forwardInvocation用于處理Invocation造烁,進(jìn)行完整轉(zhuǎn)發(fā)。

如果消息轉(zhuǎn)發(fā)也沒(méi)有處理即為無(wú)法處理午笛,會(huì)調(diào)用doesNotRecognizeSelector膨蛮,引發(fā)崩潰。

更多了解可以參考iOS開(kāi)發(fā)·runtime原理與實(shí)踐: 消息轉(zhuǎn)發(fā)篇(Message Forwarding) (消息機(jī)制季研,方法未實(shí)現(xiàn)+API不兼容奔潰,模擬多繼承)

4誉察、category能否添加屬性与涡,為什么?能否添加實(shí)例變量,為什么驼卖?

可以添加屬性氨肌,這里的屬性指@property,但跟類(lèi)里的@property又不一樣酌畜。正常的@property為:實(shí)例變量Ivar + Setter + Getter?方法怎囚,分類(lèi)里的@property這三者都沒(méi)有,需要我們手動(dòng)實(shí)現(xiàn)桥胞。

分類(lèi)是運(yùn)行時(shí)被編譯的恳守,這時(shí)類(lèi)的結(jié)構(gòu)已經(jīng)固定了,所以我們無(wú)法添加實(shí)例變量贩虾。

對(duì)于分類(lèi)自定義Setter和Getter方法催烘,我們可以通過(guò)關(guān)聯(lián)對(duì)象(Associated Object)進(jìn)行實(shí)現(xiàn)。

5缎罢、元類(lèi)的作用是什么伊群?

元類(lèi)的作用是存儲(chǔ)類(lèi)方法,同時(shí)它也是為了讓OC的類(lèi)結(jié)構(gòu)能夠形成閉環(huán)策精。

對(duì)于為甚設(shè)計(jì)元類(lèi)有以下原因舰始;

在OC的世界里一切皆對(duì)象(借鑒于Smalltalk),metaclass的設(shè)計(jì)就是要為滿(mǎn)足這一點(diǎn)咽袜。

在OC中Class也是一種對(duì)象丸卷,它對(duì)應(yīng)的類(lèi)就是metaclass,metaclass也是一種對(duì)象酬蹋,它的類(lèi)是root?metaclass及老,在往上根元類(lèi)(root metaclass)指向自己,形成了一個(gè)閉環(huán)范抓,一個(gè)完備的設(shè)計(jì)骄恶。

如果不要metaclass可不可以?也是可以的匕垫,在objc_class再加一個(gè)類(lèi)方法指針僧鲁。但是這樣的設(shè)計(jì)會(huì)將消息傳遞的過(guò)程復(fù)雜化,所以為了消息傳遞流程的復(fù)用象泵,為了一切皆對(duì)象的思想寞秃,就有了metaclass。

關(guān)于這一話(huà)題的深入討論可以參考這兩篇文章:

為什么要存在MetaClass

為什么要設(shè)計(jì)metaclass

6偶惠、類(lèi)方法是存儲(chǔ)到什么地方的春寿?類(lèi)屬性呢?

類(lèi)方法和類(lèi)屬性都是存儲(chǔ)到元類(lèi)中的忽孽。

類(lèi)屬性在Swift用的多些绑改,OC中很少有人用到谢床,但其實(shí)它也是有的,寫(xiě)法如下:

@interface Person : NSObject

// 在屬性類(lèi)別中加上class

@property (class, nonatomic, copy) NSString *name;

@end

// 調(diào)用方式

NSString *temp = Person.name;

需要注意的是跟實(shí)例屬性不一樣厘线,類(lèi)屬性不會(huì)自動(dòng)生成實(shí)例變量和setter识腿,getter方法,需要我們手動(dòng)實(shí)現(xiàn)造壮。具體實(shí)現(xiàn)方法可以參考這個(gè)文章:Objective-C Class Properties

7渡讼、講幾個(gè)runtime的應(yīng)用場(chǎng)景

hook系統(tǒng)方法進(jìn)行方法交換。

了解一個(gè)類(lèi)(閉源)的私有屬性和方法耳璧。

關(guān)聯(lián)對(duì)象成箫,實(shí)現(xiàn)添加分類(lèi)屬性的功能。

修改isa指針楞抡,自定義KVO伟众。

如果你正在跳槽或者正準(zhǔn)備跳槽不妨動(dòng)動(dòng)小手,添加一下咱們的交流群1 9 5 5 9 4 5 1 7來(lái)獲取一份詳細(xì)的大廠(chǎng)面試資料為你的跳槽多添一份保障召廷。

Runloop

1凳厢、講一下對(duì)Runloop的理解?

Runloop就是一個(gè)運(yùn)行循環(huán)竞慢,它保證了在沒(méi)有任務(wù)的時(shí)候線(xiàn)程不退出先紫,有任務(wù)的時(shí)候即使響應(yīng)。Runloop跟線(xiàn)程筹煮,事件響應(yīng)遮精,手勢(shì)識(shí)別,頁(yè)面更新败潦,定時(shí)器都有著緊密聯(lián)系本冲。

深入了解推薦ibireme的這篇深入理解RunLoop

2、可以用Runloop實(shí)現(xiàn)什么功能劫扒?

檢測(cè)卡頓

線(xiàn)程泵识矗活

性能優(yōu)化,將一些耗時(shí)操作放到runloop wait的情況處理沟饥。

性能優(yōu)化

1添怔、對(duì)TableView進(jìn)行性能優(yōu)化有哪些方式?

緩存高度

異步渲染

減少離屏渲染

2贤旷、Xcode的Instruments都有哪些調(diào)試的工具广料?

Activity Monitor(活動(dòng)監(jiān)視器):監(jiān)控進(jìn)程的CPU、內(nèi)存幼驶、磁盤(pán)艾杏、網(wǎng)絡(luò)使用情況。是程序在手機(jī)

運(yùn)行真正占用內(nèi)存大小

Allocations(內(nèi)存分配):跟蹤過(guò)程的匿名虛擬內(nèi)存和堆的對(duì)象提供類(lèi)名和可選保留/釋放歷史

Core Animation(圖形性能):顯示程序顯卡性能以及CPU使用情況

Core Data:跟蹤C(jī)ore Data文件系統(tǒng)活動(dòng)

Energy Log:耗電量監(jiān)控

File Activity:檢測(cè)文件創(chuàng)建盅藻、移動(dòng)糜颠、變化汹族、刪除等

Leaks(泄漏):一般的措施內(nèi)存使用情況,檢查泄漏的內(nèi)存其兴,并提供了所有活動(dòng)的分配和泄漏模塊的類(lèi)對(duì)象分配統(tǒng)計(jì)信息以及內(nèi)存地址歷史記錄

Network:用鏈接工具分析你的程序如何使用TCP/IP和UDP/IP鏈接

System Usage:記錄關(guān)于文件讀寫(xiě),sockets夸政,I/O系統(tǒng)活動(dòng)元旬,輸入輸出

Time Profiler(時(shí)間探查):方法執(zhí)行耗時(shí)分析

Zombies:測(cè)量一般的內(nèi)存使用,專(zhuān)注于檢測(cè)過(guò)度釋放的野指針對(duì)象守问。也提供對(duì)象分配統(tǒng)計(jì)以及主動(dòng)分配的內(nèi)存地址歷史

3匀归、講一下你做過(guò)的性能優(yōu)化的事情。

這個(gè)根據(jù)自己情況來(lái)說(shuō)吧耗帕。

4穆端、如何檢測(cè)卡頓,都有哪些方法仿便?

FPS体啰,通過(guò)CADisplayLink計(jì)算1s內(nèi)刷新次數(shù),也可以利用Instruments里的Core Animation嗽仪。

利用Runloop荒勇,實(shí)時(shí)計(jì)算?kCFRunLoopBeforeSources?和?kCFRunLoopAfterWaiting?兩個(gè)狀態(tài)區(qū)域之間的耗時(shí)是否超過(guò)某個(gè)閥值

子線(xiàn)程檢測(cè),每次檢測(cè)時(shí)設(shè)置標(biāo)記位為YES闻坚,然后派發(fā)任務(wù)到主線(xiàn)程中將標(biāo)記位設(shè)置為NO沽翔。接著子線(xiàn)程沉睡超時(shí)闕值時(shí)長(zhǎng),判斷標(biāo)志位是否成功設(shè)置成NO窿凤,如果沒(méi)有說(shuō)明主線(xiàn)程發(fā)生了卡頓仅偎。參考ANREye的實(shí)現(xiàn)

5、縮小包體積有哪些方案雳殊?

圖片壓縮橘沥,無(wú)用圖片刪除

一些大圖可以動(dòng)態(tài)下發(fā)

刪除無(wú)用類(lèi),無(wú)用方法

減少三方庫(kù)的依賴(lài)

計(jì)算機(jī)相關(guān)

1相种、項(xiàng)目編譯的流程是什么威恼?手機(jī)上的應(yīng)用程序自點(diǎn)擊圖標(biāo)開(kāi)始到首屏內(nèi)容展示都經(jīng)歷了哪些步驟?

編譯流程:

預(yù)處理:處理宏定義寝并,刪除注釋?zhuān)归_(kāi)頭文件箫措。

詞法分析:把代碼切成一個(gè)個(gè)token,比如大小括號(hào)等于號(hào)還有字符串

語(yǔ)法分析:驗(yàn)證語(yǔ)法是否正確衬潦,合成抽象語(yǔ)法樹(shù)AST

靜態(tài)分析:查找代碼錯(cuò)誤

類(lèi)型檢查:動(dòng)態(tài)和靜態(tài)

目標(biāo)代碼的生成與優(yōu)化斤蔓,包括刪除多余指令,選擇合適的尋址方式镀岛,如果開(kāi)啟了bitcode弦牡,會(huì)做進(jìn)一步的優(yōu)化

匯編:由匯編器生成匯編語(yǔ)言

機(jī)器碼:由匯編語(yǔ)言轉(zhuǎn)成機(jī)器碼友驮,生成.o文件

應(yīng)用啟動(dòng)的流程:

啟動(dòng)的前提是完成編譯,運(yùn)行程序即運(yùn)行編譯過(guò)后的目標(biāo)程序驾锰,它分為main函數(shù)前和main函數(shù)后:

main前

加載可執(zhí)行文件(App的.o文件集合)

加載動(dòng)態(tài)鏈接庫(kù)(系統(tǒng)和應(yīng)用的動(dòng)態(tài)鏈接庫(kù))卸留,進(jìn)行rebase指針調(diào)整和bind符號(hào)綁定

Objc運(yùn)行時(shí)的初始處理,包括Objc相關(guān)類(lèi)的注冊(cè)椭豫,category注冊(cè)耻瑟,selector唯一性檢查

初始化,包括執(zhí)行+load()赏酥、attribute(constructor)修飾的函數(shù)的調(diào)用喳整、創(chuàng)建C++靜態(tài)全局變量

main后

首頁(yè)初始化所需要配置文件的讀寫(xiě)操作

首頁(yè)界面渲染

2、對(duì)于基本數(shù)據(jù)類(lèi)型裸扶,一般是存儲(chǔ)到棧中的框都,它有沒(méi)有可能存在堆上,什么情況下會(huì)存儲(chǔ)到堆上呵晨?

棧和堆都是同屬一塊內(nèi)存魏保,只不過(guò)一個(gè)是高地址往低地址存儲(chǔ),一個(gè)從低地址往高地址存儲(chǔ)何荚,他們并沒(méi)有嚴(yán)格的界限說(shuō)一個(gè)值只能放在堆上或者棧上囱淋。所以基本數(shù)據(jù)類(lèi)型也是可以存儲(chǔ)到堆上的。

當(dāng)該基礎(chǔ)類(lèi)型變量被__block捕獲時(shí)餐塘,該變量連同block都會(huì)被copy到堆上妥衣。

3、數(shù)據(jù)庫(kù)中的事務(wù)是什么意思戒傻?

事務(wù)就是訪(fǎng)問(wèn)并操作各種數(shù)據(jù)項(xiàng)的一個(gè)數(shù)據(jù)庫(kù)操作序列税手,這些操作要么全部執(zhí)行,要么全部不執(zhí)行需纳。如果其中一個(gè)步驟出錯(cuò)就要撤銷(xiāo)整個(gè)操作芦倒,回滾到進(jìn)入事務(wù)之前的狀態(tài)。

4不翩、使用過(guò)什么數(shù)據(jù)庫(kù)(我回答的Sqlite兵扬,Realm),Realm在使用時(shí)有哪些注意事項(xiàng)口蝠,如何實(shí)現(xiàn)批量操作器钟?

對(duì)于Realm感興趣的同學(xué)可以看下其官方文檔

Realm需要注意的主要就是不能直接跨線(xiàn)程訪(fǎng)問(wèn)同一對(duì)象妙蔗。

批量操作可以在一個(gè)單獨(dú)的事務(wù)中執(zhí)行多個(gè)數(shù)據(jù)庫(kù)的修改傲霸。

5、LRU算法是否了解,如何實(shí)現(xiàn)一套LRU算法昙啄?

LRU(Least recently used 最近最少使用)算法是一個(gè)緩存淘汰算法穆役,其作用就是當(dāng)緩存很多時(shí),該淘汰哪些內(nèi)容梳凛,見(jiàn)名知意耿币,它的核心思想是淘汰最近使用最少的內(nèi)容。實(shí)現(xiàn)它的關(guān)鍵步驟是:

新數(shù)據(jù)插入到鏈表的頭部

每當(dāng)緩存命中時(shí)伶跷,則將數(shù)據(jù)移動(dòng)到鏈表頭部

鏈表滿(mǎn)時(shí)掰读,將尾部數(shù)據(jù)清除

這個(gè)算法在SDWebImage和Kingfisher等需要處理緩存的庫(kù)中都有實(shí)現(xiàn)。

6叭莫、知道哪些設(shè)計(jì)模式,怎么理解設(shè)計(jì)模式的作用烁试?

工廠(chǎng)模式雇初、觀(guān)察者模式、中介者模式减响、單例模式靖诗。這個(gè)根據(jù)實(shí)際情況說(shuō)吧。

7支示、如果有1000萬(wàn)個(gè)Int類(lèi)型的數(shù)字刊橘,如何對(duì)他們排序?

這里的隱藏含義是颂鸿,內(nèi)存不夠用時(shí)如何排序促绵,還有一個(gè)隱藏含義是硬盤(pán)足夠大。這是可以采用分而治之的方法嘴纺,將數(shù)據(jù)分成若干塊败晴,使每一小塊滿(mǎn)足當(dāng)前內(nèi)容大小,然后對(duì)每塊內(nèi)容單獨(dú)排序栽渴,最后采用歸并排序?qū)λ袎K進(jìn)行排序尖坤,就得到了一個(gè)有序序列。

8闲擦、設(shè)計(jì)一套數(shù)據(jù)庫(kù)方案慢味,實(shí)現(xiàn)類(lèi)似微信的搜索關(guān)鍵詞能快速檢索出包含該字符串的聊天信息,并展示對(duì)應(yīng)數(shù)量(聊天記錄的數(shù)據(jù)量較大)

可以對(duì)聊天記錄的文本值加上索引墅冷。正常情況下數(shù)據(jù)庫(kù)搜索都是全量檢索的纯路,加上索引之后只會(huì)檢索滿(mǎn)足條件的記錄,大大降低檢索量俺榆。

如果你正在跳槽或者正準(zhǔn)備跳槽不妨動(dòng)動(dòng)小手感昼,添加一下咱們的交流群1 9 5 5 9 4 5 1 7來(lái)獲取一份詳細(xì)的大廠(chǎng)面試資料為你的跳槽多添一份保障。

簡(jiǎn)歷相關(guān)問(wèn)題

1罐脊、Lottie實(shí)現(xiàn)動(dòng)畫(huà)效果的原理是什么定嗓?

iOS里的動(dòng)畫(huà)基本都是基于CoreAnimation里的API實(shí)現(xiàn)的蜕琴,Lottie也是如此。在A(yíng)E上實(shí)現(xiàn)動(dòng)畫(huà)效果宵溅,通過(guò)插件導(dǎo)出對(duì)應(yīng)的json文件凌简,Lottie的庫(kù)解析該json,轉(zhuǎn)成對(duì)應(yīng)的系統(tǒng)API方法恃逻。圖片的引用可以使用Base64編到j(luò)son里雏搂,也可以通過(guò)項(xiàng)目集成,通過(guò)路徑引用寇损。

2凸郑、OClint實(shí)現(xiàn)靜態(tài)分析的原理是什么,它是如何做到的矛市?

具體可以參考我之前寫(xiě)的如何通過(guò)靜態(tài)分析提高iOS代碼質(zhì)量芙沥。

3、MVVM和MVC有什么區(qū)別浊吏?

對(duì)比架構(gòu)時(shí)而昨,可以從是否職責(zé)分離,可測(cè)試性找田,可易維護(hù)性三個(gè)維度對(duì)比歌憨。

更多對(duì)比可以參考我翻譯的一篇文章:【譯】iOS 架構(gòu)模式--淺析MVC, MVP, MVVM 和 VIPER

4、靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別是什么墩衙?

靜態(tài)庫(kù):鏈接時(shí)被完整復(fù)制到可執(zhí)行文件中务嫡,多次使用就多份拷貝。

動(dòng)態(tài)庫(kù):鏈接時(shí)不復(fù)制底桂,而是由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存植袍,內(nèi)存中只會(huì)有一份該動(dòng)態(tài)庫(kù)。

5籽懦、了解Flutter嗎于个?它有沒(méi)有使用UIKit?它是如何渲染UI的暮顺?

UIKit是基于CoreAnimation渲染的厅篓,而Flutter并沒(méi)有用到它,而是自己基于C++實(shí)現(xiàn)了一套渲染框架捶码。

6羽氮、二進(jìn)制重排的核心依據(jù)是什么?

修改鏈接順序惫恼,減少啟動(dòng)時(shí)的缺頁(yè)中斷档押。

實(shí)踐步驟可以參考李斌同學(xué)的這篇iOS 優(yōu)化篇 - 啟動(dòng)優(yōu)化之Clang插樁實(shí)現(xiàn)二進(jìn)制重排

7、如何設(shè)計(jì)一套切換主題的方案?

核心思路是觀(guān)察者模式+協(xié)議(通知)令宿,當(dāng)獲取到主題切換時(shí)叼耙,通知各個(gè)實(shí)現(xiàn)了主題協(xié)議的類(lèi)進(jìn)行更新。

8粒没、AVPlayer和IJKPlayer有什么區(qū)別筛婉?用IJKPlayer如何實(shí)現(xiàn)一個(gè)緩存視頻列表每條視頻前1s的內(nèi)容?

因?yàn)閷?duì)IJKPlayer和FFmpeg了解的不是很深癞松,這個(gè)我也沒(méi)有確切答案爽撒,如果有了解的小伙伴可以評(píng)論告知我。

9响蓉、類(lèi)似微博的短視頻列表硕勿,滑動(dòng)停留播放,如何實(shí)現(xiàn)枫甲?

這個(gè)主要就是檢測(cè)contentOffset和屏幕中間位置首尼,設(shè)置一些邊界條件,處理滑動(dòng)過(guò)程中的切換行為言秸。

10、使用python做過(guò)哪些事迎捺?如何理解腳本語(yǔ)言举畸?

多語(yǔ)言管理,csv多語(yǔ)言文件讀取凳枝,然后寫(xiě)入到項(xiàng)目Localizable.strings中抄沮;抓取項(xiàng)目中的多語(yǔ)言字符串。

腳本(script) 其實(shí)就是一系列指令岖瑰,計(jì)算機(jī)看了指令就知道自己該做什么事情叛买。像常見(jiàn)的Python,Shell蹋订,Ruby都是腳本語(yǔ)言率挣,他們通常不需要編譯,通過(guò)解釋器運(yùn)行露戒。

數(shù)據(jù)結(jié)構(gòu)與算法

1椒功、什么是Hash表,什么是Hash碰撞智什,解決Hash碰撞有什么方法动漾?

哈希表(Hash Table,也叫散列表)荠锭,是根據(jù)關(guān)鍵碼值 (Key-Value) 而直接進(jìn)行訪(fǎng)問(wèn)的數(shù)據(jù)結(jié)構(gòu)旱眯。也就是說(shuō),它通過(guò)把關(guān)鍵碼值映射到表中一個(gè)位置來(lái)訪(fǎng)問(wèn)記錄,以加快查找的速度删豺。我們常用的Dictionary就是一種Hash表共虑。

那什么是Hash碰撞呢,我們知道Hash表的查找是通過(guò)鍵值進(jìn)行定位的吼鳞,當(dāng)兩個(gè)不同的輸入對(duì)應(yīng)一個(gè)輸出時(shí)看蚜,即為Hash碰撞,也被稱(chēng)為Hash沖突赔桌。

如果使用字典的例子你可能聯(lián)想不到?jīng)_突的情況供炎,我們假設(shè)另一種情況:假設(shè)hash表的大小為9(即有9個(gè)槽),現(xiàn)在要把一串?dāng)?shù)據(jù)存到表里:5,28,19,15,20,33,12,17,10疾党。我們使用的hash函數(shù)是對(duì)9取余音诫。這樣的話(huà)會(huì)出現(xiàn)hash(5)=5,hash(28)=1雪位,hash(19)=1竭钝。28和19都對(duì)應(yīng)一個(gè)地址,這就出現(xiàn)了Hash沖突雹洗。

解決Hash沖突的方式有開(kāi)放定址法和鏈地址法香罐。

2、如何遍歷二叉樹(shù)时肿?

二叉樹(shù)的遍歷有三種方式庇茫,對(duì)于上面這棵二叉樹(shù),他們的遍歷結(jié)果為:

前序遍歷:根節(jié)點(diǎn) > 左子節(jié)點(diǎn) > 右子節(jié)點(diǎn)螃成。

10旦签,6,4寸宏,8宁炫,14,12氮凝,16

中序遍歷:左子節(jié)點(diǎn) > 根節(jié)點(diǎn) > 右子節(jié)點(diǎn)羔巢。

4,6覆醇,8朵纷,10,12永脓,14袍辞,16

后序遍歷:左子節(jié)點(diǎn) > 右子節(jié)點(diǎn) > 根節(jié)點(diǎn)。

4常摧,8搅吁,6威创,12,16谎懦,14肚豺,10

3、簡(jiǎn)述下快速排序的過(guò)程界拦,時(shí)間復(fù)雜度是多少吸申?

快排的思想是通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小享甸,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序截碴,整個(gè)排序過(guò)程可以遞歸進(jìn)行。

一個(gè)簡(jiǎn)單的Swift實(shí)現(xiàn)方式如下:

func quicksort<T: Comparable>(_ a: [T]) -> [T] {

? guard a.count > 1 else { return a }

? let pivot = a[a.count/2]

? let less = a.filter { $0 < pivot }

? let equal = a.filter { $0 == pivot }

? let greater = a.filter { $0 > pivot }

? return quicksort(less) + equal + quicksort(greater)

}

快速排序是有好幾種的蛉威,他們的區(qū)別在于如何實(shí)現(xiàn)filter和分區(qū)基準(zhǔn)值的選取日丹。

快排的時(shí)間復(fù)雜度是O(nlogn),空間復(fù)雜度是O(logn)

4蚯嫌、有一個(gè)整數(shù)數(shù)組哲虾,如何只遍歷一遍就實(shí)現(xiàn)讓該數(shù)組奇數(shù)都在前面,偶數(shù)都在后面择示?

這個(gè)是《劍指offer》里的一道題束凑,leedcode也有對(duì)應(yīng)題目:劍指offer 21

這個(gè)相對(duì)比較簡(jiǎn)單,因?yàn)椴灰笥行蛘っぃ梢圆捎檬瘴脖闅v的方式湘今,進(jìn)行交換,我這有個(gè)參考答案:

func sorted( _ nums: inout [Int]) -> [Int] {

? ? guard !nums.isEmpty else {

? ? ? ? return []

? ? }

? ? var start = 0

? ? var end = nums.count - 1

? ? while start < end {

? ? ? ? if nums[start] % 2 != 0 {

? ? ? ? ? ? start += 1

? ? ? ? ? ? continue

? ? ? ? }

? ? ? ? if nums[end] % 2 == 0 {

? ? ? ? ? ? end -= 1

? ? ? ? ? ? continue

? ? ? ? }

? ? ? ? (nums[start], nums[end]) = (nums[end], nums[start])

? ? }

? ? return nums

}

5剪菱、假設(shè)你正在爬樓梯。需要 n 階你才能到達(dá)樓頂拴签。每次你可以爬 1 或 2 個(gè)臺(tái)階孝常。你有多少種不同的方法可以爬到樓頂呢?

leetcode 20

6蚓哩、給出一個(gè) 32 位的有符號(hào)整數(shù)构灸,你需要將這個(gè)整數(shù)中每位上的數(shù)字進(jìn)行反轉(zhuǎn)

leetcode 7

7、有紅岸梨、黃喜颁、藍(lán)三種顏色的氣球。在挪芾客王國(guó)半开,1個(gè)紅氣球+1個(gè)黃氣球+1個(gè)藍(lán)氣球可以?xún)稉Q一張彩票

2個(gè)紅氣球+1個(gè)黃氣球可以?xún)稉Q1個(gè)藍(lán)氣球。

2個(gè)黃氣球+1個(gè)藍(lán)氣球可以?xún)稉Q1個(gè)紅氣球赃份。

2個(gè)藍(lán)氣球+1個(gè)紅氣球可以?xún)稉Q1個(gè)黃氣球寂拆。

現(xiàn)在牛牛有a個(gè)紅氣球奢米,b個(gè)黃氣球, c個(gè)藍(lán)氣球纠永,牛牛想知道自己最多可以?xún)稉Q多少?gòu)埐势薄?/p>

這個(gè)是坯蕹ぃ客網(wǎng)里的一道算法題,這里有個(gè)題解可以參考尝江。

有什么其他關(guān)于大公司的面試題評(píng)論或者群聊可以分享

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涉波,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炭序,更是在濱河造成了極大的恐慌啤覆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件少态,死亡現(xiàn)場(chǎng)離奇詭異城侧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)彼妻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)嫌佑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人侨歉,你說(shuō)我怎么就攤上這事屋摇。” “怎么了幽邓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵炮温,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我牵舵,道長(zhǎng)柒啤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任畸颅,我火速辦了婚禮担巩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘没炒。我一直安慰自己涛癌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布送火。 她就那樣靜靜地躺著拳话,像睡著了一般。 火紅的嫁衣襯著肌膚如雪种吸。 梳的紋絲不亂的頭發(fā)上弃衍,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音坚俗,去河邊找鬼笨鸡。 笑死姜钳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的形耗。 我是一名探鬼主播哥桥,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼激涤!你這毒婦竟也來(lái)了拟糕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤倦踢,失蹤者是張志新(化名)和其女友劉穎送滞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辱挥,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡犁嗅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晤碘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褂微。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖园爷,靈堂內(nèi)的尸體忽然破棺而出宠蚂,到底是詐尸還是另有隱情,我是刑警寧澤童社,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布求厕,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冗恨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望十艾。 院中可真熱鬧,春花似錦腾节、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至康吵,卻和暖如春劈榨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晦嵌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工同辣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拷姿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓旱函,卻偏偏與公主長(zhǎng)得像响巢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棒妨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 夜鶯2517閱讀 127,720評(píng)論 1 9
  • 版本:ios 1.2.1 亮點(diǎn): 1.app角標(biāo)可以實(shí)時(shí)更新天氣溫度或選擇空氣質(zhì)量踪古,建議處女座就不要選了,不然老想...
    我就是沉沉閱讀 6,898評(píng)論 1 6
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月券腔,有人笑有人哭伏穆,有人歡樂(lè)有人憂(yōu)愁,有人驚喜有人失落纷纫,有的覺(jué)得收獲滿(mǎn)滿(mǎn)有...
    陌忘宇閱讀 8,536評(píng)論 28 53
  • 兔子雖然是枚小碩 但學(xué)校的碩士四人寢不夠 就被分到了博士樓里 兩人一間 在學(xué)校的最西邊 靠山 兔子的室友身體不好 ...
    待業(yè)的兔子閱讀 2,603評(píng)論 2 9