編寫高質(zhì)量iOS與OS X代碼有效方法讀書筆記(持續(xù)更新中)

1 類的頭文件中盡量少引入其他頭文件

  • 除非確有必要抠璃,否則不要引入頭文件禁漓。一般來說,應(yīng)在某個類的頭文件中使用向前聲明來提及別的類博其,并在實現(xiàn)文件中引入那些類的頭文件殃恒。這樣做可以降低類之間的耦合性以及解決循環(huán)引用頭文件的問題植旧。
  • 父類以及protocol是不能使用向前聲明的,必須要import离唐。某個類必須要遵循某一項協(xié)議病附,這種情況下盡量把“該類遵循某協(xié)議”的這條聲明移至"class-continuation"分類中。如果不行的話亥鬓,最好將協(xié)議放在某個單獨的文件中完沪,然后再引入。
//移至"class-continuation"分類中嵌戈,而不是放在.h文件中
@interface YQCircleViewController ()<UISearchBarDelegate,UISearchDisplayDelegate>{
}

2 多用字面量語法覆积,少用與之等價的方法

使用字面量語法可以縮減源代碼長度,使其更加易讀熟呛,減少代碼出錯機率技健。字面量語法實際是一種 “語法糖”,也稱 “糖衣語法”惰拱,是指計算機語言中與另外一套語法等效但是開發(fā)者用起來卻更加方便的語法雌贱。

//字面數(shù)值
NSNumber *someNumner = @1;
NSNumber *intNumner = @1;
NSNumber *floatNumner = @2.5f;
NSNumber *doubleNumner = @3.14159;
NSNumber *charNumner = @'s';

//字面量數(shù)組
NSArray *array = @[@"a",@"b"@"c"];
NSString *string = array[0];  //直接使用下標(biāo)操作數(shù)組

//字面量字典
NSDictionary *dict = @{@"key":@"value"};
NSString *string = dict[@"key"];  //直接使用鍵來操作字典

//可變數(shù)組與字典
NSMutableArray *mutable = [@[@"a",@"b"] mutableCopy];

然后應(yīng)該通過下標(biāo)操作來訪問數(shù)組或字典中的鍵來獲取字典中的元素啊送,不過注意語法糖語法的局限性:

  • 字面量所創(chuàng)建的對象必須屬于Foundation 框架,如果自定義這些類的子類欣孤,則無法用字面量語法創(chuàng)建其對象馋没;
  • 創(chuàng)建出的對象都是不可變的,需要可變則需多加一步mutableCopy降传;
  • 字面量語法創(chuàng)建數(shù)組或字典時篷朵,注意不能有nil否則拋出異常

3 多用類型常量,少用#define 預(yù)處理指令

  • 不要用預(yù)處理指令定義常量婆排。這樣定義出來的常量不含類型信息声旺,編譯器只是會在編譯前據(jù)此執(zhí)行查找與替換操作。即使有人重新定義了常量值段只,編譯器也不會產(chǎn)生警告信息腮猖,這將導(dǎo)致應(yīng)用程序中的常量值不一致。
  • 在實現(xiàn)文件中使用static const 來定義 “只在編譯單元內(nèi)可見的常量“(translation-unitspecific constant)赞枕。由于此類常量不在全局符號表中澈缺,所以無須為其名稱加前綴。
  • 在頭文件中使用extern 來聲明全局變量炕婶,并在相關(guān)實現(xiàn)文件中定義其值姐赡。這種常量要出現(xiàn)在全局符號表中,所以其名稱應(yīng)加以區(qū)隔柠掂,通常用與之相關(guān)的類型做前綴项滑。

示例:

image.png
image.png

4 用枚舉表示狀態(tài)、選項涯贞、狀態(tài)碼

  • 應(yīng)該用枚舉來表示狀態(tài)機的狀態(tài)枪狂、傳遞給方法的選項以及狀態(tài)碼等值,給這些值起個易懂的名字肩狂。
  • 在定義選項時,尤其是可以組合的選項時姥饰,可將各選項值定義為2的冪傻谁,以便通過按位操作將其組合起來。
typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) {
    UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
    UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
    UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
    UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
    UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
    UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
    UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
} __TVOS_PROHIBITED;
  • 處理枚舉類型的switch語句中不要實現(xiàn)default分支列粪,這樣的話审磁,加入新枚舉之后,編譯器會提示開發(fā)者:編譯器并未處理所有的異常

5 在對象內(nèi)部盡量直接訪問實例變量

  • 在對象內(nèi)部讀取數(shù)據(jù)時岂座,應(yīng)該直接通過實例變量來讀态蒂,而寫入數(shù)據(jù)時,則應(yīng)通過屬性來寫费什。
  • 在初始化方法及dealloc 方法中钾恢,總是應(yīng)該直接通過實例變量來讀寫數(shù)據(jù)。
  • 有時會使用惰性初始化技術(shù)配置某份數(shù)據(jù),在這種情況下瘩蚪,需要通過屬性來讀取數(shù)據(jù)泉懦。

6 理解對象等同性的概念

  • 想要檢測對象等同性,需提供isEqual和hash方法
  • 相同的對象必須有相同的hash碼疹瘦,有相同hash碼的對象未必相同
  • 應(yīng)該根據(jù)特定需求制定檢測等同性方案崩哩,NSObject默認的isEqual方法判斷的是兩個指針指向的內(nèi)存地址完全相同才相等
  • 編寫hash方法時,應(yīng)該使用計算速度快且哈希碼碰撞幾率低的算法

7 在既有類中使用關(guān)聯(lián)對象存放自定義數(shù)據(jù)

  • 可以通過"關(guān)聯(lián)對象"機制來把兩個對象關(guān)聯(lián)起來
  • 定義關(guān)聯(lián)對象時可指定內(nèi)存管理語義言沐,用以模仿屬性時所采用的"擁有關(guān)系"與"非擁有關(guān)系"
  • 只有其他做法不可取時才應(yīng)選用關(guān)聯(lián)對象邓嘹,因為這種做法通常會引入難以查找的bug
    可以給某對象關(guān)聯(lián)許多其他的對象,這些對象通過“鍵”來區(qū)分险胰。比如某個類里要處理多個警告視圖汹押,那么就必須在警告視圖的delegate方法里判斷傳入的alertView參數(shù),然后選取相應(yīng)的邏輯鸯乃。那么可以將alertView按鈕邏輯的方法關(guān)聯(lián)到alertView上鲸阻,如下例:
#import <objc/runtime.h>
static void *EOCMyAlertViewKey = @"EOCMyAlertViewKey";

- (IBAction)testAlertAssociation:(id)sender {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Quetion" message:@"" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"OK",nil];
    void (^block)(NSInteger) = ^(NSInteger buttonIndex) {
        NSLog(@"click index %i",buttonIndex);
    };
    objc_setAssociatedObject(alert, EOCMyAlertViewKey, block, OBJC_ASSOCIATION_COPY);
    [alert show];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    void (^block)(NSInteger) = objc_getAssociatedObject(alertView, EOCMyAlertViewKey);
    block(buttonIndex);
}

8 盡量使用不可變對象

  • 盡量創(chuàng)建不可變的對象。
  • 不要把可變的集合類對象作為屬性公開缨睡,而應(yīng)提供相關(guān)方法鸟悴,以此修改對象中的可變集合類對象的內(nèi)容。

9 使用 “類擴展(class-continuation)”隱藏實現(xiàn)細節(jié)

  • 通過 “類擴展” 向類中新增實例變量奖年。
  • 如果某屬性在主接口中聲明為 “只讀”细诸,而類的內(nèi)部又要用設(shè)置方法修改此屬性,那么就在 “類擴展” 中將其擴展為 “可讀寫”陋守。
  • 把私有方法的原型聲明在 “類擴展” 里面震贵。
  • 若想使類所遵循的協(xié)議不為人所知,則可于 “類擴展” 中聲明水评。

10 為私有方法名加前綴

編寫類的實現(xiàn)代碼時猩系,經(jīng)常要寫一些只在內(nèi)部使用的方法,編碼時應(yīng)為這些方法加上某些前綴中燥,如p_有助于調(diào)試寇甸,以便很容易的把公有方法和私有方法區(qū)分開,而且還便于修改且不影響已公開的公有API接口疗涉。但不要單用一個下劃線_來做私有方法的前綴拿霉,這種做法是預(yù)留給蘋果公司用的

11總是為第三方類的分類名稱加前綴

  • 向第三方類中添加分類時,總應(yīng)給其名稱加上你專用的前綴
  • 向第三方類中添加分類時咱扣,總應(yīng)給其中的方法名加上你專用的前綴

12 將類的實現(xiàn)代碼分散到便于管理的數(shù)個分類中

  • 使用分類機制把類的實現(xiàn)代碼劃分于易管理的小塊
  • 將應(yīng)該歸為私有的方法歸入名為Private的分類中绽淘,以隱藏實現(xiàn)細節(jié)

13 在dealloc方法中只釋放引用并解除監(jiān)聽

  • 在dealloc方法里,應(yīng)該做的事情就是釋放指向其他對象的引用闹伪,取消原來訂閱的KVO鍵值觀測或者NSNotificationCenter等通知
  • 如果對象持有文件描述等系統(tǒng)資源沪铭,那么應(yīng)專門編寫一個方法來釋放此種資源壮池。這樣的類要和使用者約定,用完資源后必須調(diào)用close方法
  • 執(zhí)行異步任務(wù)的方法不應(yīng)在dealloc方法里調(diào)用伦意,只能在正常狀態(tài)下調(diào)用的那些方法也不應(yīng)在dealloc方法里調(diào)用火窒,因為此時對象已經(jīng)處于回收狀態(tài)了

14 多用塊枚舉,少用for 循環(huán)

  • 遍歷集合類對象有四種方式驮肉。最基本的辦法就是for 循環(huán)熏矿,其次是NSEnumerator 遍歷法及快速遍歷法,最新离钝、最先進的方式則是 “塊枚舉法”票编。
  • “塊枚舉法” 本身就能通過GCD 來并發(fā)執(zhí)行遍歷操作,無須另行編寫代碼卵渴。而采用其他遍歷則無法輕易實現(xiàn)這一點慧域。

15 構(gòu)建緩存時選用 NSCache 而非 NSDictionay

  • NSCache 是專門來處理緩存的,在系統(tǒng)資源將要耗盡時浪读,它可以自動刪減緩存昔榴。
  • NScache 并不會 “拷貝” 鍵,而是會 “保留” 它碘橘。NScache 鍵很多時候都是由不支持拷貝操作對象充當(dāng)?shù)幕ザSCache 是線程安全的,不用編寫加鎖代碼痘拆,多個線程便可以同時訪問NSCache仰禽。

16 以自動釋放池降低內(nèi)存峰值

程序中有時會遇到大量的for循環(huán),而占用的這些內(nèi)存需要到下一次事件循環(huán)才會被釋放掉纺蛆,適當(dāng)?shù)脑黾幼詣俞尫懦乜梢越档蛢?nèi)存峰值吐葵,因為在新增的這個池末尾,會將臨時變量釋放掉桥氏。

NSMutableArray *array = [[NSMutableArray alloc] init];
    for (NSInteger i=0; i<1000; i++) {
        @autoreleasepool {
            //加上自動釋放池后温峭,可以提早釋放o這個臨時變量
            NSObject *o = [NSObject new];
            [array addObject:o];
        }
    }
  • 自動釋放池排布在棧中,系統(tǒng)創(chuàng)建好自動釋放池字支,就將其放在棧頂凤藏,清空釋放池時,就相當(dāng)于將其從棧中彈出祥款。當(dāng)對象收到autorelease消息后清笨,系統(tǒng)將其放入最頂端的自動釋放池中
  • 合理使用自動釋放池月杉,可以減低內(nèi)存峰值
  • 采用@autoreleasepool這種新式寫法能創(chuàng)建出更為輕便的自動釋放池

17 為常用的塊類型創(chuàng)建typedef

  • 以typedef重新定義塊類型刃跛,可令變量用起來更簡單
typedef int(^EOCSomeBlock) (BOOL flag);
@property (nonatomic,copy) EOCSomeBlock block;
  • 定義新類型應(yīng)遵循現(xiàn)有命名習(xí)慣,勿使其名稱與別的類型沖突
  • 不妨為同一個塊定義多個類型別名苛萎,如果要重構(gòu)代碼使用了塊類型的某個別名桨昙,那么只需要修改typedef中的塊簽名即可检号,無需改動其他typedef。類型定義的簽名相同蛙酪,但用在不同的地方齐苛,開發(fā)者看到類型別名及簽名中的參數(shù)之后,很容易就能理解此類型的用途桂塞。
typedef void(^ACAccountStoreSaveCompletionHandler)(BOOL success, NSError *error);
typedef void(^ACAccountStoreRemoveCompletionHandler)(BOOL success, NSError *error);
typedef void(^ACAccountStoreRequestAccessCompletionHandler)(BOOL granted, NSError *error);

18 多用GCD凹蜂,少用perfromSelector的方法

  • performSelector系列方法在內(nèi)存管理方面容易有疏失,它無法確定將要執(zhí)行的選擇子具體是什么阁危,因為ARC編譯器無法為其插入適當(dāng)?shù)膬?nèi)存管理方法
  • performSelector系列方法所能處理的選擇子太過局限玛痊,選擇子的返回類型及發(fā)送給方法的參數(shù)個數(shù)比較受限制
  • 如果想把任務(wù)放到另外一個線程執(zhí)行,最好不要用perfromSelector系列方法狂打,應(yīng)將任務(wù)封裝到塊里擂煞,調(diào)用GCD相關(guān)的方法來實現(xiàn)

19 不要使用dispatch_get_current_queue

  • dispatch_get_current_queue函數(shù)的行為常與開發(fā)者所預(yù)期的不同,此函數(shù)已經(jīng)廢棄趴乡,只應(yīng)做調(diào)試之用

20 熟悉系統(tǒng)框架

  • 許多系統(tǒng)框架可以直接使用对省,其中最重要的便有Foundation與CoreFoundation,這兩個框架提供了構(gòu)建應(yīng)用程序所需的很多核心功能晾捏。能使用系統(tǒng)框架的地方蒿涎,盡量使用系統(tǒng)框架。

21 精簡intialize與load方法的實現(xiàn)代碼

21.1 load

對于加入運行期系統(tǒng)中的每個類class及分類category來說粟瞬,一定會調(diào)用load方法同仆,而且僅調(diào)用一次。比如app啟動時裙品,肯定會執(zhí)行一次俗批,但是在執(zhí)行該方法時,運行期系統(tǒng)處于“脆弱狀態(tài)”(fragile state)市怎,在執(zhí)行子類的load方法時岁忘,必先執(zhí)行所有超類的load方法,如果代碼還依賴了其他程序類庫区匠,那么程序庫相關(guān)類的load方法也必定會先執(zhí)行干像。然而給定一個程序庫,是無法判斷出各個類的加載順序驰弄,因此在類的load方法里調(diào)用其他的類是不安全的

+ (void)load {
    NSLog(@"Loading EOCClassB");
    //在EOCClassB類的load方法里調(diào)用EOCClassA麻汰,但此時卻不確定EOCClassA是否已經(jīng)load完畢
    EOCClassA *o = [EOCClassA new];
}

還有個重要的事情要注意,load方法不像普通方法遵循繼承的規(guī)則戚篙,如果本類沒有實現(xiàn)load方法五鲫,那么不管其各級超累是否實現(xiàn)load方法都不會執(zhí)行。分類和其所屬的類都可能實現(xiàn)load方法岔擂,那么類一定比分類的load方法先執(zhí)行位喂。而且load方法務(wù)必實現(xiàn)的精簡一些浪耘,因為整個應(yīng)用程序在執(zhí)行l(wèi)oad方法時都會阻塞。
實際上塑崖,凡是想通過load在類加載之前執(zhí)行某些任務(wù)的七冲,基本都不太對,筆者目前自己見過最多的便是在load方法里寫方法交換邏輯规婆。

21.2 initialize

如果想執(zhí)行與類相關(guān)的初始化操作澜躺,還有個辦法就是覆寫initialize方法。initialize方法是當(dāng)程序運用到了相關(guān)類抒蚜,才會調(diào)用苗踪,且只調(diào)用一次,如果某個類一直沒有用則initialize方法一直不會被執(zhí)行削锰,就是所謂的“惰性調(diào)用”通铲。initialize方法執(zhí)行時,運行期系統(tǒng)是處于正常狀態(tài)的器贩,從運行期系統(tǒng)完整度調(diào)用來說可以調(diào)用任何類的任意方法颅夺。而且運行期系統(tǒng)能確保initialize方法一定會在線程安全環(huán)境中執(zhí)行,因此只有執(zhí)行initialize方法的線程可以操作類或者實例蛹稍,其他的線程全部都要先阻塞吧黄。
initialize方法遵循繼承規(guī)則,如果某個類沒有實現(xiàn)它唆姐,而其超類實現(xiàn)了拗慨,那么就會運行超類的實現(xiàn)代碼。
initialize方法也要盡量保持精簡奉芦,如果在initialize方法里調(diào)用了其他類赵抢,如果這個類沒有被初始化,那么此時系統(tǒng)會迫使其初始化声功,但如果這個類又應(yīng)用了本類(互相依賴)烦却,但本類此時還沒初始化完,則會出現(xiàn)問題先巴。
總結(jié)來說:

  • 在加載階段其爵,如果類實現(xiàn)了load方法,那么系統(tǒng)會調(diào)用它伸蚯。分類里也可以定義load方法摩渺,但是類的load方法會比分類的load方法先調(diào)用。與其他方法不同剂邮,load方法不參與覆寫機制摇幻。子類的load方法時,必先執(zhí)行所有超類的load方法,但子類如果沒有實現(xiàn)load方法囚企,則也不會調(diào)用父類的load方法。
  • 首次使用某個類時瑞眼,系統(tǒng)會向其發(fā)送initialize消息龙宏,由于此方法遵循覆寫機制,因此最好在方法里區(qū)分當(dāng)前初始化的是哪個類伤疙。
  • load和initialize方法都應(yīng)實現(xiàn)的精簡一些银酗,有助于保持應(yīng)用程序的響應(yīng)能力,也能減少依賴環(huán)的產(chǎn)生
  • 無法在編譯期設(shè)定的全局常量徒像,可以放在initialize方法里初始化
static void *EOCMyAlertViewKey = @"EOCMyAlertViewKey";

//NSMutableArray在這里初始化編譯器會報錯
static NSMutableArray *ksomeObjects;         //= [NSMutableArray new];

typedef int(^EOCSomeBlock) (BOOL flag);

@interface ViewController ()<UIAlertViewDelegate>{
}
@property (nonatomic,copy) EOCSomeBlock block;
@end

@implementation ViewController
+ (void)initialize {
    //放在這里初始化
    ksomeObjects = [NSMutableArray new];
}
@end

22 通過委托與數(shù)據(jù)源協(xié)議進行對象間通信

  • 委托模式為對象提供了一套接口黍特,使其可由將相關(guān)事件告知其他對象
  • 將委托對象應(yīng)該支持的接口定義成協(xié)議,在協(xié)議中把可能需要處理的事件定義成方法
  • 當(dāng)某對象需要從另外一個對象中獲取數(shù)據(jù)時锯蛀,可以使用委托模式灭衷,這種情景下亦稱“數(shù)據(jù)源協(xié)議”(data source protocol)
  • 如有必要,可實現(xiàn)含有位段的結(jié)構(gòu)體旁涤,將委托協(xié)議對象是否能響應(yīng)相關(guān)協(xié)議方法這一信息緩存至其中翔曲。因為反復(fù)的通過respondToSeletor方法判斷是否能響應(yīng)某方法會很多余,基本第一次判斷能響應(yīng)則能響應(yīng)劈愚,不能響應(yīng)則不能響應(yīng)瞳遍,無需反復(fù)判斷,因此建議將判斷的值存儲起來菌羽。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掠械,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子注祖,更是在濱河造成了極大的恐慌猾蒂,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件是晨,死亡現(xiàn)場離奇詭異婚夫,居然都是意外死亡,警方通過查閱死者的電腦和手機署鸡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門案糙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人靴庆,你說我怎么就攤上這事时捌。” “怎么了炉抒?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵奢讨,是天一觀的道長。 經(jīng)常有香客問我焰薄,道長拿诸,這世上最難降的妖魔是什么扒袖? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮亩码,結(jié)果婚禮上季率,老公的妹妹穿的比我還像新娘。我一直安慰自己描沟,他們只是感情好飒泻,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吏廉,像睡著了一般泞遗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上席覆,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天史辙,我揣著相機與錄音,去河邊找鬼佩伤。 笑死髓霞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的畦戒。 我是一名探鬼主播方库,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼障斋!你這毒婦竟也來了纵潦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤垃环,失蹤者是張志新(化名)和其女友劉穎邀层,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遂庄,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡寥院,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涛目。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秸谢。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖霹肝,靈堂內(nèi)的尸體忽然破棺而出估蹄,到底是詐尸還是另有隱情,我是刑警寧澤沫换,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布臭蚁,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏垮兑。R本人自食惡果不足惜冷尉,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望系枪。 院中可真熱鬧雀哨,春花似錦、人聲如沸嗤无。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽当犯。三九已至,卻和暖如春割疾,著一層夾襖步出監(jiān)牢的瞬間嚎卫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工宏榕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拓诸,地道東北人。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓麻昼,卻偏偏與公主長得像奠支,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抚芦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361

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