提高iOS代碼質(zhì)量 2018-01-07

轉(zhuǎn)發(fā)自
http://blog.csdn.net/skylin19840101/article/details/51500900

謝謝大佬

質(zhì)量問(wèn)題不僅僅是商品應(yīng)該注重的,在移動(dòng)互聯(lián)占據(jù)人們各個(gè)生活領(lǐng)域的前提下清笨,產(chǎn)品質(zhì)量更顯重要摩疑,以最具人氣和潛力的iOS為例,iOS從系統(tǒng)研發(fā)和客戶端軟件開(kāi)發(fā)環(huán)節(jié)對(duì)質(zhì)量的要求異常高三圆,在注重用戶體驗(yàn)的同時(shí)提升產(chǎn)品質(zhì)量,這也是很多用戶非iOS不用的原因,iOS系統(tǒng)已經(jīng)讓移動(dòng)互聯(lián)網(wǎng)的品質(zhì)得到升級(jí)博肋。那么我們?cè)陂_(kāi)發(fā)iOS產(chǎn)品時(shí),如何提高它的質(zhì)量呢蜂厅?

涉及到質(zhì)量問(wèn)題匪凡,這就是一個(gè)很大的話題,包括很多方面掘猿,比如代碼書寫的質(zhì)量病游,開(kāi)發(fā)流程的規(guī)范,項(xiàng)目管理的到位,測(cè)試的最后把關(guān)等各個(gè)環(huán)節(jié)衬衬。編碼需要規(guī)范买猖,命名需要有意義;接口低耦合滋尉、高內(nèi)聚玉控、易擴(kuò)展,代碼能重用狮惜、避免重復(fù)代碼高诺;提交代碼后需要做CodeReview;Release前碾篡,自測(cè)需要充分虱而,包括單元測(cè)試、和其他模塊(服務(wù)器)的聯(lián)調(diào)測(cè)試开泽,網(wǎng)絡(luò)性能測(cè)試牡拇,不同機(jī)型、不同系統(tǒng)版本穆律、越獄與否等各個(gè)方面的測(cè)試惠呼;通過(guò)冒煙測(cè)試后才交于QA測(cè)試等等。在這里众旗,我們主要分享從開(kāi)發(fā)人員的角度如何提高產(chǎn)品質(zhì)量罢杉,包含的內(nèi)容如下:

<a name="t0" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>避免異常:

image

從上面可以看到,iOS開(kāi)發(fā)中常見(jiàn)的異常包括以下幾種:
NSInvalidArgumentException
NSRangeException
NSGenericException
NSInternalInconsistencyException
NSFileHandleOperationException

<a name="t1" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>NSInvalidArgumentException

非法參數(shù)異常(NSInvalidArgumentException)是 Objective - C 代碼最常出現(xiàn)的錯(cuò)誤贡歧,所以平時(shí)在寫代碼的時(shí)候滩租,需要多加注意,加強(qiáng)對(duì)參數(shù)的檢查利朵,避免傳入非法參數(shù)導(dǎo)致異常律想,其中尤以nil參數(shù)為甚。

<a name="t2" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>集合數(shù)據(jù)的參數(shù)傳遞

比如NSMutableArray, NSMutableDictionary的數(shù)據(jù)操作

(1) 不能刪除nil的key
image

(2) NSDictionary不能添加nil的對(duì)象


image

(3) 不能插入nil的對(duì)象
[圖片上傳失敗...(image-ca0fe2-1515303094173)]

(4) 其他一些nil參數(shù)


image

<a name="t3" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>其他一些API的使用

<a name="t4" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>

(1) NSDictionary不能刪除nil的key

<a name="t5" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>

APP一般都會(huì)有網(wǎng)絡(luò)操作绍弟,免不了使用網(wǎng)絡(luò)相關(guān)接口技即,比如NSURL的初始化,不能傳入nil的http地址:

image

<a name="t6" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>未實(shí)現(xiàn)的方法

(1) .h文件里修改了函數(shù)名樟遣,卻忘了修改.m文件里對(duì)應(yīng)的函數(shù)名而叼;或者頭文件里定義了函數(shù),.m文件里沒(méi)有實(shí)現(xiàn)

(2) 使用第三方庫(kù)時(shí)豹悬,沒(méi)有添加”-ObjC” flag
(3) MRC時(shí)葵陵,大部分情況下是因?yàn)閷?duì)象被提前release了,在你心里不希望他release的情況下瞻佛,指針還在脱篙,對(duì)象已經(jīng)不在了。 比如:


image
image

<a name="t7" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>

(4) 對(duì)象類型使用不當(dāng)

[圖片上傳失敗...(image-af0fee-1515303094173)]

image

因?yàn)閕magenS本來(lái)是NSDictionary的對(duì)象,被當(dāng)做NSString來(lái)處理了

image

類似的绊困,NSDictionary的對(duì)象被當(dāng)做NSArrary來(lái)處理了

<a name="t8" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a> NSRangeException

越界異常(NSRangeException)也是比較常出現(xiàn)的異常文搂,有如下幾種類型:

<a name="t9" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>

<a name="t10" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>數(shù)組最大下標(biāo)處理錯(cuò)誤

比如數(shù)組長(zhǎng)度count, index的下標(biāo)范圍[0, count -1], 在開(kāi)發(fā)時(shí),可能index的最大值超過(guò)數(shù)組的范圍秤朗;


image

<a name="t11" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>

<a name="t12" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>下標(biāo)的值是其他變量賦值

這樣會(huì)有很大的不確定性煤蹭, 可能是一個(gè)很大的整數(shù)值

image
image

這里的值達(dá)到32位和64位整數(shù)的最大值,肯定是一個(gè)不正常的參數(shù)川梅,比如:

image

如果找不到str 疯兼,則返回NSNotFound然遏,32位下它就是2147483647贫途,64位下18446744073709551615 ,將它作為參數(shù)傳遞則會(huì)導(dǎo)致NSRangeException待侵。

<a name="t13" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>

<a name="t14" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>使用空數(shù)組

如果一個(gè)數(shù)組剛剛初始化丢早,還是空的,就對(duì)它進(jìn)行相關(guān)操作

[圖片上傳失敗...(image-4a5ea9-1515303094176)]

所以秧倾,為了避免NSRangeException的發(fā)生怨酝,必須對(duì)傳入的index參數(shù)進(jìn)行合法性檢查,是否在集合數(shù)據(jù)的個(gè)數(shù)范圍內(nèi)那先。

<a name="t15" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>

NSGenericException

NSGenericException這個(gè)異常最容易出現(xiàn)在foreach操作中农猬,在for in循環(huán)中如果修改所遍歷的數(shù)組,無(wú)論你是add或remove售淡,都會(huì)出錯(cuò)斤葱,比如:

image

執(zhí)行上面的代碼會(huì)出現(xiàn)以下的錯(cuò)誤:

image

原因就在這 "for in",它的內(nèi)部遍歷使用了類似 Iterator進(jìn)行迭代遍歷,一旦元素變動(dòng)揖闸,之前的元素全部被失效揍堕,所以在foreach的循環(huán)當(dāng)中,最好不要去進(jìn)行元素的修改動(dòng)作汤纸,若需要修改衩茸,循環(huán)改為for遍歷,由于內(nèi)部機(jī)制不同贮泞,不會(huì)產(chǎn)生修改后結(jié)果失效的問(wèn)題楞慈。
[圖片上傳失敗...(image-c8a4bb-1515303094173)]

<a name="t16" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>NSMallocException

這也是內(nèi)存不足的問(wèn)題,無(wú)法分配足夠的內(nèi)存空間

image

<a name="t17" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>NSFileHandleOperationException

處理文件時(shí)的一些異常啃擦,最常見(jiàn)的還是存儲(chǔ)空間不足的問(wèn)題囊蓝,比如應(yīng)用頻繁的保存文檔,緩存資料或者處理比較大的數(shù)據(jù):[圖片上傳失敗...(image-ec2fa3-1515303094176)]

所以在文件處理里议惰,需要考慮到手機(jī)存儲(chǔ)空間的問(wèn)題慎颗。

<a name="t18" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>二、錯(cuò)誤處理

在進(jìn)行函數(shù)調(diào)用的時(shí)候,如果有NSError的參數(shù)傳遞俯萎,最好都處理以下傲宜,特別是一些網(wǎng)絡(luò)和文件的處理,比如:

文件操作錯(cuò)誤

比如在刪除文件時(shí)夫啊,有可能發(fā)生錯(cuò)誤函卒,我們需要做一些處理
[圖片上傳失敗...(image-60990c-1515303094172)]

網(wǎng)絡(luò)處理錯(cuò)誤

在使用NSURLConnection進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),發(fā)生錯(cuò)誤是難免的撇眯,必須做相應(yīng)處理


image

<a name="t19" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>三报嵌、本地緩存的兼容處理

在APP的運(yùn)行過(guò)程中,難免會(huì)有I/O的操作熊榛,一般的情況锚国,從技術(shù)的角度來(lái)看也不會(huì)出什么問(wèn)題,但是業(yè)務(wù)邏輯上可能就需要特別注意了玄坦,比如APP升級(jí)版本后血筑,可能保存緩存數(shù)據(jù)的格式發(fā)生變化了,讀取數(shù)據(jù)后的處理邏輯也就相應(yīng)發(fā)生變化煎楣,這時(shí)就需要考慮兼容舊版本數(shù)據(jù)的處理,否則對(duì)升級(jí)用戶了說(shuō)豺总,很可能由于異常發(fā)生崩潰。

<a name="t20" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>四择懂、解析網(wǎng)絡(luò)數(shù)據(jù)

客戶端開(kāi)發(fā)時(shí)喻喳,對(duì)接收到的服務(wù)器數(shù)據(jù),需要特別小心困曙,因?yàn)榻?jīng)過(guò)網(wǎng)絡(luò)傳輸回來(lái)的數(shù)據(jù)都是不可信的表伦,什么問(wèn)題都可能發(fā)生,比如協(xié)議中該有的字段沒(méi)有赂弓,是整數(shù)型的字段結(jié)果傳了一個(gè)子串绑榴,Json格式的內(nèi)容變成xml了…,所以我們?cè)诮馕龇?wù)器數(shù)據(jù)時(shí)盈魁,需要有充分的異常處理機(jī)制翔怎。

<a name="t21" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>五、代碼靜態(tài)檢查

在開(kāi)發(fā)完成后杨耙,需要對(duì)代碼進(jìn)行靜態(tài)檢查赤套,這樣能發(fā)現(xiàn)一些內(nèi)存泄露以及一些warning。

<a name="t22" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>內(nèi)存泄露

<a name="t23" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a> MRC

在MRC的時(shí)候珊膜,內(nèi)存泄露是個(gè)大問(wèn)題容握,一不小心就會(huì)中招

[圖片上傳失敗...(image-699c34-1515303094175)]

注意上面的代碼并不是L63行存在泄漏,我們點(diǎn)擊“Potential leak of an object”前面的箭頭车柠,指示會(huì)出現(xiàn)一些變化剔氏,如下圖塑猖。
image

alloc一個(gè)對(duì)象的時(shí)候,其內(nèi)存計(jì)數(shù)內(nèi)存計(jì)數(shù)(retain count)+1


image
image

因?yàn)閏ontent的setter方發(fā)會(huì)將object的內(nèi)存計(jì)數(shù)+1谈跛,如下代碼羊苟,content是retain屬性。執(zhí)行完L62代碼后感憾,self.content的內(nèi)存計(jì)數(shù)就為 2


image

建議修改方案:


image

<a name="t24" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>ARC

在ARC下蜡励,這方面的問(wèn)題就少很多了,但也還是會(huì)出現(xiàn)的阻桅,比如:

(1)使用CF CG有關(guān)的函數(shù)凉倚,內(nèi)存的釋放還是需要手動(dòng)調(diào)用的,不調(diào)用則會(huì)造成內(nèi)存泄漏


image

CFUUIDRef和CFStringRef都需要手動(dòng)釋放


image

CGImageRef類似也需要手動(dòng)釋放

(2) Runtime方法中的class_copyIvarListclass_copyMethodList這些方法返回的對(duì)象,也需要手動(dòng)釋放(free)

image

(3) 如果iOS中使用C/C++編程

 比如使用Openssl的RSA接口嫂沉,用到一些內(nèi)存的分配操作稽寒,使用結(jié)束需要釋放

[圖片上傳失敗...(image-ff2626-1515303094173)]

在iOS中,怎么避免內(nèi)存泄漏的產(chǎn)生呢输瓜?除了開(kāi)發(fā)經(jīng)驗(yàn)的積累瓦胎,我們也可以通過(guò)兩個(gè)方法來(lái)發(fā)現(xiàn)內(nèi)存泄漏芬萍,以便及時(shí)修復(fù)尤揣,一個(gè)就是上面講到的靜態(tài)分析(Analyze),比較簡(jiǎn)單柬祠;對(duì)于靜態(tài)沒(méi)有檢測(cè)出來(lái)的內(nèi)存泄露問(wèn)題北戏,需要使用動(dòng)態(tài)的方法,下一節(jié)來(lái)分享漫蛔。

<a name="t25" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>無(wú)效數(shù)據(jù)監(jiān)測(cè)(Dead store)

Unused嗜愈、Never read....這個(gè)比較簡(jiǎn)單,修改即可莽龟。

<a name="t26" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>邏輯錯(cuò)誤監(jiān)測(cè)(Logic error)

[圖片上傳失敗...(image-5b1cb5-1515303094174)]

Tag不等于1蠕嫁、2和3的時(shí)候,就會(huì)出現(xiàn)很問(wèn)題了毯盈。len is a garbage value剃毒。建議在聲明變量時(shí),同時(shí)進(jìn)行初始化搂赋。

<a name="t27" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>其他一些warning

對(duì)完美主義者來(lái)說(shuō)赘阀,warning在Xcode里始終都比較礙眼,直接消除脑奠。

<a name="t28" style="box-sizing: border-box; background-color: transparent; color: rgb(79, 161, 219); text-decoration: none; margin: 0px; padding: 0px; font-weight: 400; outline: 0px; background-position: initial initial; background-repeat: initial initial;"></a>Instruments分析

Analyze分析內(nèi)存泄露不能把所有的內(nèi)存泄露查出來(lái)基公,有的內(nèi)存泄露是在運(yùn)行時(shí),用戶操作時(shí)才產(chǎn)生的宋欺。在 C轰豆、C++混編時(shí)胰伍,對(duì)于C++的內(nèi)存分配,也是需要手動(dòng)釋放酸休,比如iOS中使用Openssl來(lái)進(jìn)行RSA的加解密操作喇辽,其中就有很多的內(nèi)存操作,如果不進(jìn)行手動(dòng)釋放雨席,Analyze是檢查不出來(lái)的菩咨,這個(gè)時(shí)候就需要用到Instruments了。

初始化


image

釋放的代碼注釋掉
[圖片上傳失敗...(image-c34e8f-1515303094170)]
這個(gè)時(shí)候使用Analyze分析陡厘,一點(diǎn)內(nèi)存泄漏也沒(méi)有抽米,我們使用Instruments來(lái)分析

“Product” -> “Profile”:


image

按上面操作,build成功后跳出Instruments工具糙置,選擇Leaks工具云茸,這時(shí)候Instruments工具就運(yùn)行起來(lái)了,顯示效果如下:


image

點(diǎn)擊上面的”紅色的圓圈”谤饭,才會(huì)啟動(dòng)對(duì)應(yīng)的APP标捺,這時(shí)”紅色的圓圈”變成”黑色的正方形”:


image

這時(shí)用戶就可以在APP上任意操作,查看內(nèi)存使用情況揉抵,選擇”Leak Checks”項(xiàng)亡容,右邊的圖中,如果是”綠色的勾”表示內(nèi)存使用正常冤今,”紅色的叉”則表示有內(nèi)存泄漏闺兢,這時(shí)點(diǎn)擊”黑色的正方形”,讓APP暫停下來(lái)戏罢。


image

這時(shí)你只要在”Reponsible Frame”中雙擊對(duì)應(yīng)的方法屋谭,就會(huì)跳轉(zhuǎn)到具體的代碼,比如雙擊”MS_RSA_Public_E”:
image

代表malloc后沒(méi)有使用free釋放OutBuf的內(nèi)存龟糕。
修改如下:


image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桐磁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子讲岁,更是在濱河造成了極大的恐慌我擂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件催首,死亡現(xiàn)場(chǎng)離奇詭異扶踊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)郎任,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門秧耗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人舶治,你說(shuō)我怎么就攤上這事分井〕碘” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵尺锚,是天一觀的道長(zhǎng)珠闰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瘫辩,這世上最難降的妖魔是什么伏嗜? 我笑而不...
    開(kāi)封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮伐厌,結(jié)果婚禮上承绸,老公的妹妹穿的比我還像新娘。我一直安慰自己挣轨,他們只是感情好军熏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著卷扮,像睡著了一般荡澎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晤锹,一...
    開(kāi)封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天摩幔,我揣著相機(jī)與錄音,去河邊找鬼抖甘。 笑死热鞍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衔彻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼偷办,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艰额!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起椒涯,我...
    開(kāi)封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柄沮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后废岂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祖搓,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年湖苞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拯欧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡财骨,死狀恐怖镐作,靈堂內(nèi)的尸體忽然破棺而出藏姐,到底是詐尸還是另有隱情,我是刑警寧澤该贾,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布羔杨,位于F島的核電站,受9級(jí)特大地震影響杨蛋,放射性物質(zhì)發(fā)生泄漏兜材。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一逞力、第九天 我趴在偏房一處隱蔽的房頂上張望护姆。 院中可真熱鬧,春花似錦掏击、人聲如沸卵皂。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灯变。三九已至,卻和暖如春捅膘,著一層夾襖步出監(jiān)牢的瞬間添祸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工寻仗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刃泌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓署尤,卻偏偏與公主長(zhǎng)得像耙替,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子曹体,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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