iOS程序執(zhí)行順序和UIViewController 的生命周期(整理)

一. iOS程序的啟動執(zhí)行順序

** 程序啟動順序圖 **

iOS啟動原理圖.png

** 具體執(zhí)行流程 **

程序入口

進(jìn)入main函數(shù)嚣鄙,設(shè)置AppDelegate稱為函數(shù)的代理

程序完成加載

[AppDelegate application:didFinishLaunchingWithOptions:]

創(chuàng)建window窗口

程序被激活

[AppDelegate applicationDidBecomeActive:]

當(dāng)點(diǎn)擊command+H時(shí)(針對模擬器,手機(jī)是當(dāng)點(diǎn)擊home鍵)

程序取消激活狀態(tài)

[AppDelegate applicationWillResignActive:];

程序進(jìn)入后臺

[AppDelegate applicationDidEnterBackground:];

點(diǎn)擊進(jìn)入工程

程序進(jìn)入前臺

[AppDelegate applicationWillEnterForeground:]

程序被激活

[AppDelegate applicationDidBecomeActive:];

** 分析 **

1.? 對于applicationWillResignActive(非活動)與applicationDidEnterBackground(后臺)這兩個(gè)的區(qū)別越除。

applicationWillResignActive(非活動):

比如當(dāng)有電話進(jìn)來或短信進(jìn)來或鎖屏等情況下咸包,這時(shí)應(yīng)用程序掛起進(jìn)入非活動狀態(tài),也就是手機(jī)界面還是顯示著你當(dāng)前的應(yīng)用程序的窗口,只不過被別的任務(wù)強(qiáng)制占用了,也可能是即將進(jìn)入后臺狀態(tài)(因?yàn)橐冗M(jìn)入非活動狀態(tài)然后進(jìn)入后臺狀態(tài))

applicationDidEnterBackground(后臺):

指當(dāng)前窗口不是你的App,大多數(shù)程序進(jìn)入這個(gè)后臺會在這個(gè)狀態(tài)上停留一會,時(shí)間到之后會進(jìn)入掛起狀態(tài)(Suspended)堪置。如果你程序特殊處理后可以長期處于后臺狀態(tài)也可以運(yùn)行。

**Suspended (掛起)**: 程序在后臺不能執(zhí)行代碼收厨。系統(tǒng)會自動把程序變成這個(gè)狀態(tài)而且不會發(fā)出通知晋柱。當(dāng)掛起時(shí),程序還是停留在內(nèi)存中的诵叁,當(dāng)系統(tǒng)內(nèi)存低時(shí)雁竞,系統(tǒng)就把掛起的程序清除掉,為前臺程序提供更多的內(nèi)存拧额。

如下圖所示:

活動和非活動.png

**2.UIApplicationMain函數(shù)解釋: **

入口函數(shù):

intmain(intargc,char* argv[]) {@autoreleasepool{returnUIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegateclass]));? ? ? ? } }UIApplicationMain(intargc,char*argv[],NSString*principalClassName,NSString*delegateClassName);

argc和**argv** 參數(shù)是為了與C語言保持一致碑诉。

**principalClassName (主要類名)** 和 **delegateClassName (委托類名)**。

(1) 如果principalClassName是nil侥锦,那么它的值將從Info.plist去獲取进栽,如果Info.plist沒有,則默認(rèn)為UIApplication恭垦。principalClass這個(gè)類除了管理整個(gè)程序的生命周期之外什么都不做快毛,它只負(fù)責(zé)監(jiān)聽事件然后交給delegateClass去做格嗅。

(2)delegateClass將在工程新建時(shí)實(shí)例化一個(gè)對象。NSStringFromClass([AppDelegate class])

**AppDelegate類實(shí)現(xiàn)文件 **

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {NSLog(@"--- %s ---",__func__);//__func__打印方法名returnYES;}- (void)applicationWillResignActive:(UIApplication*)application {NSLog(@"--- %s ---",__func__);}- (void)applicationDidEnterBackground:(UIApplication*)application {NSLog(@"--- %s ---",__func__);}- (void)applicationWillEnterForeground:(UIApplication*)application {NSLog(@"--- %s ---",__func__);}- (void)applicationDidBecomeActive:(UIApplication*)application {NSLog(@"--- %s ---",__func__);}- (void)applicationDidReceiveMemoryWarning:(UIApplication*)application {NSLog(@"--- %s ---",__func__);}- (void)applicationWillTerminate:(UIApplication*)application {NSLog(@"--- %s ---",__func__);}

** 打印調(diào)用順序 **

** 啟動程序 **

----[AppDelegate application:didFinishLaunchingWithOptions:]-------[AppDelegate applicationDidBecomeActive:]---

** 按下Command + H + SHIFT**

----[AppDelegate applicationWillResignActive:]-------[AppDelegate applicationDidEnterBackground:]---

** 重新點(diǎn)擊 進(jìn)入程序 **

----[AppDelegate applicationWillEnterForeground:]-------[AppDelegate applicationDidBecomeActive:]---

** 選擇 模擬器的Simulate Memory Warning**

----[AppDelegate applicationDidReceiveMemoryWarning:]---

** 分析: **

1.application:didFinishLaunchingWithOptions:

程序首次已經(jīng)完成啟動時(shí)執(zhí)行唠帝,一般在這個(gè)函數(shù)里創(chuàng)建window對象屯掖,將程序內(nèi)容通過window呈現(xiàn)給用戶。

applicationWillResignActive(非活動)

程序?qū)⒁ctive狀態(tài)時(shí)調(diào)用襟衰,比如有電話進(jìn)來或者按下Home鍵贴铜,之后程序進(jìn)入后臺狀態(tài),對應(yīng)的applicationWillEnterForeground(即將進(jìn)入前臺)方法瀑晒。

該函數(shù)里面主要執(zhí)行操作:

a . 暫停正在執(zhí)行的任務(wù)

b. 禁止計(jì)時(shí)器

c. 減少OpenGL ES幀率

d. 若為游戲應(yīng)暫停游戲

3.applicationDidEnterBackground(已經(jīng)進(jìn)入后臺)

對應(yīng)applicationDidBecomeActive(已經(jīng)變成前臺)

該方法用來:

a. 釋放共享資源

b. 保存用戶數(shù)據(jù)(寫到硬盤)

c.? 作廢計(jì)時(shí)器

d. 保存足夠的程序狀態(tài)以便下次修復(fù);

applicationWillEnterForeground(即將進(jìn)入前臺)

程序即將進(jìn)入前臺時(shí)調(diào)用绍坝,對應(yīng)applicationWillResignActive(即將進(jìn)入后臺),

這個(gè)方法用來: 撤銷applicationWillResignActive中做的改變苔悦。

applicationDidBecomeActive(已經(jīng)進(jìn)入前臺)

程序已經(jīng)變?yōu)锳ctive(前臺)時(shí)調(diào)用轩褐。對應(yīng)applicationDidEnterBackground(已經(jīng)進(jìn)入后臺)。

注意: 若程序之前在后臺玖详,在此方法內(nèi)刷新用戶界面

applicationWillTerminate

程序即將退出時(shí)調(diào)用灾挨。記得保存數(shù)據(jù),如applicationDidEnterBackground方法一樣竹宋。

等候.jpeg

二.UIViewController的 生命周期

** 代碼 示例 **

#pragma mark --- life circle// 非storyBoard(xib或非xib)都走這個(gè)方法- (instancetype)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil {NSLog(@"%s", __FUNCTION__);if(self= [superinitWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {? ? ? ? }returnself;}// 如果連接了串聯(lián)圖storyBoard 走這個(gè)方法- (instancetype)initWithCoder:(NSCoder*)aDecoder {NSLog(@"%s", __FUNCTION__);if(self= [superinitWithCoder:aDecoder]) {? ? ? ? ? ? }returnself;}// xib 加載 完成- (void)awakeFromNib {? ? [superawakeFromNib];NSLog(@"%s", __FUNCTION__);}// 加載視圖(默認(rèn)從nib)- (void)loadView {NSLog(@"%s", __FUNCTION__);self.view = [[UIViewalloc] initWithFrame:[UIScreenmainScreen].bounds];self.view.backgroundColor = [UIColorredColor];}//視圖控制器中的視圖加載完成,viewController自帶的view加載完成- (void)viewDidLoad {NSLog(@"%s", __FUNCTION__);? ? [superviewDidLoad];}//視圖將要出現(xiàn)- (void)viewWillAppear:(BOOL)animated {NSLog(@"%s", __FUNCTION__);? ? [superviewWillAppear:animated];}// view 即將布局其 Subviews- (void)viewWillLayoutSubviews {NSLog(@"%s", __FUNCTION__);? ? [superviewWillLayoutSubviews];}// view 已經(jīng)布局其 Subviews- (void)viewDidLayoutSubviews {NSLog(@"%s", __FUNCTION__);? ? [superviewDidLayoutSubviews];}//視圖已經(jīng)出現(xiàn)- (void)viewDidAppear:(BOOL)animated {NSLog(@"%s", __FUNCTION__);? ? [superviewDidAppear:animated];}//視圖將要消失- (void)viewWillDisappear:(BOOL)animated {NSLog(@"%s", __FUNCTION__);? ? [superviewWillDisappear:animated];}//視圖已經(jīng)消失- (void)viewDidDisappear:(BOOL)animated {NSLog(@"%s", __FUNCTION__);? ? [superviewDidDisappear:animated];}//出現(xiàn)內(nèi)存警告? //模擬內(nèi)存警告:點(diǎn)擊模擬器->hardware-> Simulate Memory Warning- (void)didReceiveMemoryWarning {NSLog(@"%s", __FUNCTION__);? ? [superdidReceiveMemoryWarning];}// 視圖被銷毀- (void)dealloc {NSLog(@"%s", __FUNCTION__);}

** 查看 打印 結(jié)果 **

2017-03-0118:03:41.577ViewControllerLifeCircle[32254:401790]-[ViewController initWithCoder:]2017-03-0118:03:41.579ViewControllerLifeCircle[32254:401790]-[ViewController awakeFromNib]2017-03-0118:03:41.581ViewControllerLifeCircle[32254:401790]-[ViewController loadView]2017-03-0118:03:46.485ViewControllerLifeCircle[32254:401790]-[ViewController viewDidLoad]2017-03-0118:03:46.486ViewControllerLifeCircle[32254:401790]-[ViewController viewWillAppear:]2017-03-0118:03:46.487ViewControllerLifeCircle[32254:401790]-[ViewController viewWillLayoutSubviews]2017-03-0118:03:46.488ViewControllerLifeCircle[32254:401790]-[ViewController viewDidLayoutSubviews]2017-03-0118:03:46.488ViewControllerLifeCircle[32254:401790]-[ViewController viewWillLayoutSubviews]2017-03-0118:03:46.488ViewControllerLifeCircle[32254:401790]-[ViewController viewDidLayoutSubviews]2017-03-0118:03:46.490ViewControllerLifeCircle[32254:401790]-[ViewController viewDidAppear:]2017-03-0119:03:13.308ViewControllerLifeCircle[32611:427962]-[ViewController viewWillDisappear:]2017-03-0119:03:14.683ViewControllerLifeCircle[32611:427962]-[ViewController viewDidDisappear:]2017-03-0119:03:14.683ViewControllerLifeCircle[32611:427962]-[ViewController dealloc]2017-03-0119:12:05.927ViewControllerLifeCircle[32611:427962]-[ViewController didReceiveMemoryWarning]

** 分析 **

** 1.initWithNibName:bundle: **

初始化UIViewController地技,執(zhí)行關(guān)鍵數(shù)據(jù)初始化操作蜈七,非StoryBoard創(chuàng)建UIViewController都會調(diào)用這個(gè)方法。

** 注意: 不要在這里做View相關(guān)操作莫矗,View在loadView方法中才初始化飒硅。**

** 2.initWithCoder:**

如果使用StoryBoard進(jìn)行視圖管理,程序不會直接初始化一個(gè)UIViewController作谚,StoryBoard會自動初始化或在segue被觸發(fā)時(shí)自動初始化三娩,因此方法initWithNibName:bundle不會被調(diào)用,但是initWithCoder會被調(diào)用妹懒。

** 3.awakeFromNib**

當(dāng)awakeFromNib方法被調(diào)用時(shí)雀监,所有視圖的outlet和action已經(jīng)連接,但還沒有被確定眨唬,這個(gè)方法可以算作適合視圖控制器的實(shí)例化配合一起使用的会前,因?yàn)橛行┬枰鶕?jù)用戶洗好來進(jìn)行設(shè)置的內(nèi)容,無法存在storyBoard或xib中匾竿,所以可以在awakeFromNib方法中被加載進(jìn)來瓦宜。

** 4.loadView**

當(dāng)執(zhí)行到loadView方法時(shí),如果視圖控制器是通過nib創(chuàng)建岭妖,那么視圖控制器已經(jīng)從nib文件中被解檔并創(chuàng)建好了临庇,接下來任務(wù)就是對view進(jìn)行初始化反璃。

loadView方法在UIViewController對象的view被訪問且為空的時(shí)候調(diào)用。這是它與awakeFromNib方法的一個(gè)區(qū)別假夺。

假設(shè)我們在處理內(nèi)存警告時(shí)釋放view屬性:self.view = nil淮蜈。因此loadView方法在視圖控制器的生命周期內(nèi)可能被調(diào)用多次。

loadView方法不應(yīng)該直接被調(diào)用侄泽,而是由系統(tǒng)調(diào)用礁芦。它會加載或創(chuàng)建一個(gè)view并把它賦值給UIViewController的view屬性。

在創(chuàng)建view的過程中悼尾,首先會根據(jù)nibName去找對應(yīng)的nib文件然后加載柿扣。如果nibName為空或找不到對應(yīng)的nib文件,則會創(chuàng)建一個(gè)空視圖(這種情況一般是純代碼)

注意:在重寫loadView方法的時(shí)候闺魏,不要調(diào)用父類的方法未状。

** 5.viewDidLoad**

當(dāng)loadView將view載入內(nèi)存中,會進(jìn)一步調(diào)用viewDidLoad方法來進(jìn)行進(jìn)一步設(shè)置析桥。此時(shí)司草,視圖層次已經(jīng)放到內(nèi)存中,通常泡仗,我們對于各種初始化數(shù)據(jù)的載入埋虹,初始設(shè)定、修改約束娩怎、移除視圖等很多操作都可以這個(gè)方法中實(shí)現(xiàn)搔课。

視圖層次(view hierachy):因?yàn)槊總€(gè)視圖都有自己的子視圖,這個(gè)視圖層次其實(shí)也可以理解為一顆樹狀的數(shù)據(jù)結(jié)構(gòu)截亦。而樹的根節(jié)點(diǎn)爬泥,也就是根視圖(root view),在UIViewController中以view屬性。它可以看做是其他所有子視圖的容器崩瓤,也就是根節(jié)點(diǎn)袍啡。

** 6.viewWillAppear**

系統(tǒng)在載入所有的數(shù)據(jù)后,將會在屏幕上顯示視圖却桶,這時(shí)會先調(diào)用這個(gè)方法境输,通常我們會在這個(gè)方法對即將顯示的視圖做進(jìn)一步的設(shè)置。比如颖系,設(shè)置設(shè)備不同方向時(shí)該如何顯示畴嘶;設(shè)置狀態(tài)欄方向、設(shè)置視圖顯示樣式等集晚。

另一方面窗悯,當(dāng)APP有多個(gè)視圖時(shí),上下級視圖切換是也會調(diào)用這個(gè)方法偷拔,如果在調(diào)入視圖時(shí)蒋院,需要對數(shù)據(jù)做更新亏钩,就只能在這個(gè)方法內(nèi)實(shí)現(xiàn)。

** 7.viewWillLayoutSubviews**

view即將布局其Subviews欺旧。 比如view的bounds改變了(例如:狀態(tài)欄從不顯示到顯示,視圖方向變化)姑丑,要調(diào)整Subviews的位置,在調(diào)整之前要做的工作可以放在該方法中實(shí)現(xiàn)

** 8.viewDidLayoutSubviews**

view已經(jīng)布局其Subviews辞友,這里可以放置調(diào)整完成之后需要做的工作栅哀。

** 9.viewDidAppear**

在view被添加到視圖層級中以及多視圖,上下級視圖切換時(shí)調(diào)用這個(gè)方法称龙,在這里可以對正在顯示的視圖做進(jìn)一步的設(shè)置留拾。

** 10.viewWillDisappear**

在視圖切換時(shí),當(dāng)前視圖在即將被移除鲫尊、或被覆蓋是痴柔,會調(diào)用該方法,此時(shí)還沒有調(diào)用removeFromSuperview疫向。

** 11.viewDidDisappear**

view已經(jīng)消失或被覆蓋咳蔚,此時(shí)已經(jīng)調(diào)用removeFromSuperView;

** 12.dealloc**

視圖被銷毀,此次需要對你在init和viewDidLoad中創(chuàng)建的對象進(jìn)行釋放搔驼。

** 13.didReceiveMemoryWarning**

在內(nèi)存足夠的情況下谈火,app```的視圖通常會一直保存在內(nèi)存中,但是如果內(nèi)存不夠舌涨,一些沒有正在顯示的viewController就會收到內(nèi)存不足的警告堆巧,然后就會釋放自己擁有的視圖,以達(dá)到釋放內(nèi)存的目的泼菌。但是系統(tǒng)只會釋放內(nèi)存,并不會釋放對象的所有權(quán)啦租,所以通常我們需要在這里將不需要顯示在內(nèi)存中保留的對象釋放它的所有權(quán)哗伯,將其指針置nil``。

三. 視圖的生命歷程

[ViewController initWithCoder:]或[ViewController initWithNibName:Bundle]:首先從歸檔文件中加載UIViewController對象篷角。即使是純代碼焊刹,也會把nil作為參數(shù)傳給后者。

[UIView awakeFromNib]:作為第一個(gè)方法的助手恳蹲,方法處理一些額外的設(shè)置虐块。

**[ViewController loadView]:創(chuàng)建或加載一個(gè)view并把它賦值給UIViewController的view屬性。

-

[ViewController viewDidLoad]: ** 此時(shí)整個(gè)視圖層次(view hierarchy)已經(jīng)放到內(nèi)存中嘉蕾,可以移除一些視圖贺奠,修改約束,加載數(shù)據(jù)等错忱。

**[ViewController viewWillAppear:]: ** 視圖加載完成儡率,并即將顯示在屏幕上挂据。還沒設(shè)置動畫,可以改變當(dāng)前屏幕方向或狀態(tài)欄的風(fēng)格等儿普。

[ViewController viewWillLayoutSubviews]:即將開始子視圖位置布局

[ViewController viewDidLayoutSubviews]:用于通知視圖的位置布局已經(jīng)完成

[ViewController viewDidAppear:]:視圖已經(jīng)展示在屏幕上崎逃,可以對視圖做一些關(guān)于展示效果方面的修改。

[ViewController viewWillDisappear:]:視圖即將消失

[ViewController viewDidDisappear:]:視圖已經(jīng)消失

四: 總結(jié):

只有init系列的方法,如initWithNibName需要自己調(diào)用眉孩,其他方法如loadView和awakeFromNib則是系統(tǒng)自動調(diào)用个绍。而viewWill/Did系列的方法則類似于回調(diào)和通知,也會被自動調(diào)用浪汪。

純代碼寫視圖布局時(shí)需要注意巴柿,要手動調(diào)用loadView方法,而且不要調(diào)用父類的loadView方法吟宦。純代碼和用IB的區(qū)別僅存在于loadView方法及其之前篮洁,編程時(shí)需要注意的也就是loadView方法。

除了initWithNibName和awakeFromNib方法是處理視圖控制器外殃姓,其他方法都是處理視圖袁波。這兩個(gè)方法在視圖控制器的生命周期里只會調(diào)用一次。

三. 最后

送上一張喜歡的圖片:

初晴.jpeg

這是一篇總結(jié)筆記蜗侈,大家有興趣可以蠻看一下篷牌,如果覺得不錯,麻煩給個(gè)喜歡,若發(fā)現(xiàn)有錯誤的地方請及時(shí)反饋踏幻,謝謝枷颊!

作者:林大鵬天地

鏈接:http://www.reibang.com/p/d60b388b19f5

來源:簡書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)该面,非商業(yè)轉(zhuǎn)載請注明出處夭苗。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市隔缀,隨后出現(xiàn)的幾起案子题造,更是在濱河造成了極大的恐慌,老刑警劉巖猾瘸,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件界赔,死亡現(xiàn)場離奇詭異,居然都是意外死亡牵触,警方通過查閱死者的電腦和手機(jī)淮悼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揽思,“玉大人袜腥,你說我怎么就攤上這事《ず梗” “怎么了瞧挤?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵锡宋,是天一觀的道長。 經(jīng)常有香客問我特恬,道長执俩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任癌刽,我火速辦了婚禮役首,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘显拜。我一直安慰自己衡奥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布远荠。 她就那樣靜靜地躺著矮固,像睡著了一般。 火紅的嫁衣襯著肌膚如雪譬淳。 梳的紋絲不亂的頭發(fā)上档址,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音邻梆,去河邊找鬼守伸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浦妄,可吹牛的內(nèi)容都是我干的尼摹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼剂娄,長吁一口氣:“原來是場噩夢啊……” “哼蠢涝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阅懦,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤和二,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后故黑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庭砍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年场晶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怠缸。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诗轻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出揭北,到底是詐尸還是另有隱情扳炬,我是刑警寧澤吏颖,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站恨樟,受9級特大地震影響半醉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜劝术,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一缩多、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧养晋,春花似錦衬吆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至零酪,卻和暖如春冒嫡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛾娶。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工灯谣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛔琅。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓胎许,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罗售。 傳聞我的和親對象是個(gè)殘疾皇子辜窑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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