iOS項(xiàng)目中常用的“打補(bǔ)丁”技巧

嗯吗购。。怎么開(kāi)篇呢

砸狞。

捻勉。

(一個(gè)小時(shí)。刀森。搓腳毛苦思中踱启。。)

研底。

呵呵埠偿,你以為博主真的不知道怎么開(kāi)篇么,這里花了一個(gè)小時(shí)的時(shí)間其實(shí)是另有深意的好么榜晦,我的套路就是這么濕9诮!乾胶,其實(shí)博主是為了闡述一個(gè)問(wèn)題抖剿!就是如果只想了一個(gè)標(biāo)題朽寞,內(nèi)容卻不知道怎么組織就會(huì)是這樣的慢性尷尬癥。就像我們做項(xiàng)目的時(shí)候經(jīng)常腦袋一熱斩郎,二話不說(shuō)上來(lái)就擼代碼脑融。然后就發(fā)現(xiàn)框架不行,不夠靈活無(wú)法擴(kuò)展缩宜,功能缺失肘迎!然后在你準(zhǔn)備調(diào)整架構(gòu)的時(shí)候,產(chǎn)品經(jīng)理就跳出來(lái)補(bǔ)上一刀——改需求锻煌。

這種絕望膜宋,我們都經(jīng)歷過(guò)!

產(chǎn)品經(jīng)理常用必殺:

『用戶反應(yīng)炼幔,按鈕雙擊會(huì)有錯(cuò)誤秋茫,所以你把整個(gè)項(xiàng)目有交互的控件都設(shè)置為不能雙擊吧,干巴爹』

——

『這個(gè)輸入框怎么能輸入??????這個(gè)呢乃秀,把所有的輸入框都禁止輸入亂七八糟的東西吧肛著,么么噠』

——這個(gè)是emoji,并沒(méi)有這么亂七八糟跺讯。枢贿。

『哦之前忘了定義,給所有的輸入框都限制大數(shù)吧刀脏、給所有的頁(yè)面都加上返回手勢(shì)吧局荚,給所有的……』

『線上有幾個(gè)頁(yè)面暫時(shí)不需要了,能屏蔽掉么』

愈污。耀态。。

我能和產(chǎn)品探討一下引力波的探測(cè)與廣義相對(duì)論的必然聯(lián)系么暂雹?老子弄死你丫的

我想項(xiàng)目新人幾乎都遇到過(guò)這些坑吧首装,產(chǎn)品經(jīng)理不專業(yè)在一般的公司里是常態(tài),現(xiàn)在的互聯(lián)網(wǎng)杭跪,一言不合就改需求仙逻,也是個(gè)常態(tài)。

但是強(qiáng)大的猿類們涧尿,決不能屈服于這種常態(tài)系奉,變態(tài)起來(lái)!姑廉!

只要努力微笑缺亮,命運(yùn)也會(huì)懼怕我的獠牙。

回到這次的主題——『打補(bǔ)丁』

什么是打補(bǔ)丁呢庄蹋,打補(bǔ)丁是使用針線在織物上輔以破布以縫補(bǔ)上瞬内,是民間偉大的傳統(tǒng)手工藝之一迷雪。該技藝嚴(yán)謹(jǐn)精密限书,講究施針虫蝶,針?lè)ㄋ_(dá)百余種,常見(jiàn)的有滾倦西、鋪能真、蓋、戳等等扰柠,針腳整齊粉铐、摻色輕柔、虛實(shí)合度卤档、變化豐富蝙泼。一千多年來(lái),逐步形成劝枣。汤踏。。誒舔腾,這老毛病就是改不了溪胶,總是喜歡一本正經(jīng)的扯犢子~~

博主要說(shuō)的『打補(bǔ)丁』必然不是針線活!再次聲明這里是技術(shù)博客稳诚,并非傳統(tǒng)技藝授受中心哗脖!

我們給一個(gè)東西打補(bǔ)丁,原因就兩個(gè)字扳还!破才避。

所以我們給項(xiàng)目打補(bǔ)丁也是因?yàn)轫?xiàng)目破了,就像遇到上面的整改需求氨距,功能不完善了工扎,功能缺失了我們就有了打補(bǔ)丁的必要了。

在iOS中打補(bǔ)丁衔蹲,我以修補(bǔ)時(shí)機(jī)為主分為兩種打補(bǔ)丁的方式肢娘,

  • 開(kāi)發(fā)中的打補(bǔ)丁
  • 線上的打補(bǔ)丁

開(kāi)發(fā)中修補(bǔ)

早知今日,何必當(dāng)初舆驶。何出此感慨橱健?假如開(kāi)始項(xiàng)目的時(shí)候框架設(shè)計(jì)好一點(diǎn),今天還會(huì)淪落到打補(bǔ)丁么沙廉?拘荡?但是耍流氓的敏捷開(kāi)發(fā)、坑爹的開(kāi)發(fā)周期撬陵、逆天的用戶需求之下何來(lái)優(yōu)秀的框架搭設(shè)吧好蟆网缝?

看著產(chǎn)品方案,我顫抖的小嘴剛要張開(kāi)說(shuō)『一個(gè)禮拜框架搭設(shè)蟋定,兩個(gè)禮拜編碼粉臊,應(yīng)該…』然而老板拍拍你的肩膀『小伙子 這個(gè)周末弄出來(lái),我以前也是做開(kāi)發(fā)的驶兜,時(shí)間很充足哦扼仲,不許騙我喔~』,老板你確定你不是以前做PPT的抄淑。

這個(gè)時(shí)候的心情就跟剛看完《小時(shí)代》一樣憋屈屠凶。所以開(kāi)發(fā)中需要打補(bǔ)丁的狀況太多了,改結(jié)構(gòu)肆资,重寫(xiě)矗愧,時(shí)間不夠,所以只能打補(bǔ)丁了郑原!

AOP

當(dāng)初學(xué)習(xí)JavaEE的時(shí)候接觸了該理念唉韭,反正文鄒鄒的概念博主也不貼出來(lái)了,AOP就是面向切面編程的簡(jiǎn)稱颤专,說(shuō)白了就是一個(gè)打補(bǔ)丁的編程方式纽哥!不侵入式地給一個(gè)方法添加代碼。冠名之『 潤(rùn)物細(xì)無(wú)聲の技能』栖秕,嘿嘿春塌,有個(gè)片假名的標(biāo)題,你們都興奮了起來(lái)呢~~

至于AOP的基本理念簇捍、適用場(chǎng)景等只壳,各位看官就自行Wiki吧。什么竟然說(shuō)博主其實(shí)也不懂什么是AOPJ钏堋:鹁洹!

知道什么是學(xué)霸么事格!就是舉手投足高分拿下惕艳、信手拈來(lái)理論來(lái)辯、回眸一笑全是敗將驹愚!不要懷疑远搪!這就是博主,真學(xué)霸逢捺!

說(shuō)了這么多谁鳍,到底怎么用AOP方式給項(xiàng)目打補(bǔ)丁呢?

我們來(lái)打個(gè)栗子吧!

『只允許所有的控件的單擊』

一個(gè)項(xiàng)目中少說(shuō)成百上千的控件倘潜,即使有些控件復(fù)用绷柒,項(xiàng)目中控件的數(shù)量也會(huì)幾十上百的UI控件無(wú)法復(fù)用,那怎么把這幾十上百的控件都禁止雙擊呢涮因?

我們知道UIView有個(gè)屬性

@property(nonatomic,getter=isExclusiveTouch) BOOL       exclusiveTouch __TVOS_PROHIBITED;         // default is NO

如果一個(gè)View設(shè)置exclusiveTouch為YES的話废睦,那么該View就會(huì)獨(dú)占事件,就是當(dāng)點(diǎn)擊自己的時(shí)候蕊退,其他所有的View的事件都會(huì)被Block郊楣,并且當(dāng)前的View也只能單次點(diǎn)擊憔恳。利用這個(gè)特性我們就能把所有的控件的這個(gè)屬性都設(shè)置為YES不就行了嘛瓤荔。

然后吭吃吭吃地給幾十上百個(gè)控件都設(shè)置了該屬性,看到都累钥组,這樣的方式打補(bǔ)丁输硝,那萬(wàn)一產(chǎn)品又來(lái)了說(shuō)不要禁止雙擊呢?

你這不是在給項(xiàng)目打補(bǔ)丁程梦,是在打自己点把。

我們有下面這樣投機(jī)的方式:

@implementation MyView //繼承自UIView
+ (void)load{ //load方法是所有繼承NSObject類都擁有的類方法,可以直接理解為這個(gè)方法加載的灰常早灰常的早S旄健郎逃!
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];
        //把原來(lái)的方法換掉
        SEL originalSelector = @selector(willMoveToSuperview:);//View被加到父View的時(shí)候的回調(diào)
        SEL swizzledSelector = @selector(ddwillMoveToSuperview:);
        
        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
        
        BOOL didAddMethod =class_addMethod(class,
                                           originalSelector,
                                           method_getImplementation(swizzledMethod),
                                           method_getTypeEncoding(swizzledMethod));
        
        if (didAddMethod) {
            class_replaceMethod(class,
                                swizzledSelector,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

- (void)ddwillMoveToSuperview:(UIView *)newSuperview{
    [self ddwillMoveToSuperview:newSuperview];//這個(gè)地方 可自行資料為何用self
    [self setExclusiveTouch:YES];
}

@end

其實(shí)這就就是OC的Runtime的 Method Swizzling,很輕易地實(shí)現(xiàn)了AOP打補(bǔ)丁挺份,這樣我們的UIView都只能單擊啦褒翰,哈哈,擊潰產(chǎn)品+1匀泊。

更多的資料任意門(mén):

Method Swizzling 和 AOP 實(shí)踐{:target="_blank"}

當(dāng)然很多優(yōu)秀的開(kāi)源項(xiàng)目都是潤(rùn)物細(xì)無(wú)聲的老司機(jī)优训,他們的庫(kù)不需要添加任何代碼就能跑起來(lái),其實(shí)這個(gè)方式就是AOP各聘,就是使用了load方法和Runtime揣非!

比如給鍵盤(pán)打補(bǔ)丁老司機(jī)的 IQKeyboardManager{:target="_blank"}

fuckingd。躲因。 噢不 是forking dog團(tuán)隊(duì)的給返回手勢(shì)打補(bǔ)丁的UITableView-FDTemplateLayoutCell{:target="_blank"} 這個(gè)團(tuán)隊(duì)還是非常棒的早敬!他們的開(kāi)源項(xiàng)目質(zhì)量都很高!值得學(xué)習(xí)大脉!

Category

Category可以給任意一個(gè)繼承自NSObject的類添加方法搞监,重寫(xiě)方法! 其作用就是為了輕繼承的箱靴,所以利用Category同樣可以給項(xiàng)目打補(bǔ)断俟洹!

同樣的問(wèn)題

『只允許所有的控件的單擊』

我們可以給UIView寫(xiě)一個(gè)Category

#import "UIView+SingleTap.h"

@implementation UIView(SingleTap)
//該方法會(huì)直接覆蓋原View的方法
-(BOOL)isExclusiveTouch{ 
    return YES;
}
@end

不足之處就是在使用的時(shí)候必須引用該Category的頭文件

當(dāng)然如果你確定要干掉所有控件的雙擊,也可以在Pch預(yù)編譯頭文件中引入該Category棍矛,這樣整個(gè)項(xiàng)目的每個(gè)文件默認(rèn)都會(huì)引入這個(gè)Category安疗,一勞永逸了。

Notification

利用通知也能給項(xiàng)目修修補(bǔ)補(bǔ)够委。

個(gè)人認(rèn)為作為一個(gè)iOS開(kāi)發(fā)者首先都要有一定的YY能力荐类!怎么說(shuō)?因?yàn)槲覀儙缀醪豢赡芸吹綉?yīng)用層框架源碼茁帽,所以很多實(shí)現(xiàn)機(jī)制只能靠猜玉罐!也因?yàn)檫@種狀況,我覺(jué)得iOSer都應(yīng)該養(yǎng)成一個(gè)癖好——對(duì)蘋(píng)果暴露的方法和屬性列表要近乎狂熱地感興趣潘拨,比如學(xué)習(xí)一個(gè)框架的時(shí)候頭文件中所有東西都不要放過(guò)吊输!也應(yīng)該學(xué)會(huì)掃描方法列表和成員變量的技能,比如有好事者把iOS Runtime的所有私有接口都掃面了出來(lái) iOS-Runtime-Headers{:target="_blank"} 這個(gè)東西真TM太贊了L贰季蚂!哈哈

現(xiàn)在我們有這樣的一個(gè)需求

『讓所有的UITextField不允許輸入emoji表情』

如果在每個(gè)使用了UITextField的地方使用代理方法

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 

然后一個(gè)一個(gè)字符的檢測(cè),如果是emoji的話就刪除琅束,想想全局有幾十上百的UITextField扭屁,就菊花一緊,這么多改起來(lái)蛋疼涩禀,以后維護(hù)起來(lái)還會(huì)更蛋碎料滥,所以這種方法是絕不可行的!艾船!

當(dāng)然就想想AOP葵腹、和Category的方式了,當(dāng)然這些方式必然能做到的丽声,但是我們這里要用別的方法礁蔗!

二話不說(shuō)擼出UITextfieldDelegate.h

我們可以看到有幾個(gè)String常量!看到Notification 關(guān)鍵字就絕逼是注冊(cè)接受通知用的了雁社!可以猜到UITextField在?各種狀態(tài)回調(diào)時(shí)會(huì)發(fā)出好幾個(gè)通知:

UIKIT_EXTERN NSString *const UITextFieldTextDidBeginEditingNotification;
UIKIT_EXTERN NSString *const UITextFieldTextDidEndEditingNotification;
UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification;

所以我們可以利用著幾個(gè)通知這么做

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    /**
     *  監(jiān)聽(tīng)全局的textview和textfield的EndEidt
     */
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(enhanceGlobalInputs:) name:UITextFieldTextDidEndEditingNotification object:nil];
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(enhanceGlobalInputs:) name:UITextViewTextDidEndEditingNotification object:nil];
    return YES;
}
   
   
- (void)enhanceGlobalInputs:(NSNotification*)notification{
    //移除emoji表情 stringByRemovingEmoji是我給NSString寫(xiě)的一個(gè)擴(kuò)展浴井,用于移除Emoji
    if ([notification.name isEqualToString:@"UITextFieldTextDidEndEditingNotification"]) {
        ((UITextField *)notification.object).text = [((UITextField*)notification.object).text stringByRemovingEmoji];
    }else if([notification.name isEqualToString:@"UITextViewTextDidEndEditingNotification"]){
        ((UITextView *)notification.object).text = [((UITextView*)notification.object).text stringByRemovingEmoji];
    }
    
    //限制大數(shù) 只允許輸入10位長(zhǎng)度的數(shù)字 isPositiveFloat是一個(gè)判斷字符串中的數(shù)字是否是合法數(shù)字的方法,簡(jiǎn)單的正則匹配
    NSString*(^limitBigNum)(NSString* num) = ^(NSString* num){
        if ([Tools isPositiveFloat:num]) {
            if (num.length>10) {
                return [num substringWithRange:NSMakeRange(0, 10)];
            }else{
                return num;
            }
        }else{
            return num;
        }
    };
    if ([notification.name isEqualToString:@"UITextFieldTextDidChangeNotification"]) {
        ((UITextField *)notification.object).text = limitBigNum(((UITextField *)notification.object).text);
    }else if([notification.name isEqualToString:@"UITextViewTextDidChangeNotification"]){
        ((UITextView *)notification.object).text = limitBigNum(((UITextView *)notification.object).text);
    }
}

NSString+Emoji.m

#import "NSString+Emoji.h"
#include <unicode/utf8.h>

@implementation NSString(Emoji)

- (NSString *)stringByRemovingEmoji {
    NSData *d = [self dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];//有損轉(zhuǎn)換
    if(!d){
        return nil;
    }
    const char *buf = (char*)d.bytes;
    NSUInteger len = [d length];
    char *str = (char *)malloc(len);//分配char*len大小的內(nèi)存
    unsigned int inputIndex = 0, outpuIndex = 0;
    int uc;//當(dāng)前unicode字符的編碼 十進(jìn)制表示
    while (inputIndex < len) {
        U8_NEXT_UNSAFE(buf, inputIndex, uc);//一個(gè)一個(gè)字符遍歷
        if(0x2100 <= uc && uc <= 0x26ff) continue;//是emoji就放棄本輪循環(huán)
        if(0x1d000 <= uc && uc <= 0x1f77f) continue;//是emoji就放棄本輪循環(huán)
        U8_APPEND_UNSAFE(str, outpuIndex, uc);//不是emoji表情,添加到str中
    }
    return [[NSString alloc] initWithBytesNoCopy:str length:outpuIndex encoding:NSUTF8StringEncoding freeWhenDone:YES];
}
@end

宏替換

最后這種方法也許很多人都知道怎么用了霉撵,iOS的編譯機(jī)制是這樣的:對(duì)于擁有相同方法簽名的方法磺浙,后編譯的會(huì)覆蓋較早編譯的方法。

#pragma mark - 重寫(xiě)NSLog,Debug模式下打印日志和當(dāng)前行數(shù)
#if DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"\nfunction:%s line:%d content:%s\n", __FUNCTION__, __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(FORMAT, ...) nil
#endif

iOS框架的NSLog會(huì)比較早編譯徒坡,但是最后會(huì)被我們應(yīng)用中的覆蓋掉撕氧。

這樣就等于給全局的NSLog給打上一個(gè)補(bǔ)丁了或者說(shuō)給NSLog增強(qiáng)了!這個(gè)就不贅述了喇完。

線上的修補(bǔ)

因?yàn)樘O(píng)果一個(gè)多禮拜審核周期的尿性伦泥,給一個(gè)線上的項(xiàng)目打補(bǔ)丁還是很有意義的。但是線上的打補(bǔ)丁方式條件就要苛刻許多了!一般是在項(xiàng)目中先植入一個(gè)引擎類的東西不脯,然后移動(dòng)端去服務(wù)端獲取修補(bǔ)的指令(Lua府怯、JavaScript等腳本,至于用什么語(yǔ)言和這個(gè)修補(bǔ)引擎的設(shè)計(jì)有關(guān))防楷,然后這個(gè)引擎會(huì)將指令通過(guò)一定的映射規(guī)則生成本地的的可執(zhí)行指令牺丙,比如OC中可以使用Runtime新增類或者修改類,然后達(dá)到打補(bǔ)丁的效果复局,這也稱為熱更新技術(shù)冲簿!下面的都是成熟的熱更新引擎,可以學(xué)習(xí)一下

wax

使用Wax給你的應(yīng)用程序打補(bǔ)丁{:target="_blank"}

JSPatch

JSPatch{:target="_blank"}

不過(guò)如果你的項(xiàng)目支持了熱更新亿昏,那么產(chǎn)品就更加肆無(wú)忌憚了峦剔,因?yàn)槟憧梢越o線上的項(xiàng)目打補(bǔ)丁了,所以你懂得~~

『這樣要改一下』龙优。羊异。被嚇得都質(zhì)壁分離了事秀!

總結(jié)

這篇文主要是分享了本人在正式項(xiàng)目中遇到時(shí)間緊迫但是急需變更需求的時(shí)候的一些解決方法與思路彤断,都是拙見(jiàn),都是野路子易迹,但是我就是喜歡這樣宰衙,哈哈 (自帶BGM我就是愛(ài)音樂(lè)別叫我停下來(lái)~)

但是,預(yù)見(jiàn)性的架構(gòu)設(shè)計(jì)思想可以讓你避免掉很多的野路子睹欲,一份代碼的優(yōu)雅以及可靠都是在一些規(guī)范的設(shè)計(jì)原則上建立起來(lái)的供炼,所以哦,像一些基本的設(shè)計(jì)原則比如Don't repeat yourself 原則窘疮;封裝成類袋哼,或者在基類中的封裝;眾多設(shè)計(jì)模式有良好的擴(kuò)展和靈活特性的指導(dǎo)闸衫;又或者利用其他編程范式如函數(shù)式涛贯、響應(yīng)式來(lái)寫(xiě)出更加健壯靈活的代碼,可以讓你的項(xiàng)目更加健壯蔚出、靈活弟翘、、高效骄酗、優(yōu)雅稀余。

散了!回家抄黨章避避邪去了趋翻,又要改需求睛琳。。。师骗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茁影,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丧凤,更是在濱河造成了極大的恐慌募闲,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愿待,死亡現(xiàn)場(chǎng)離奇詭異浩螺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)仍侥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)要出,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人农渊,你說(shuō)我怎么就攤上這事患蹂。” “怎么了砸紊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵传于,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我醉顽,道長(zhǎng)沼溜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任游添,我火速辦了婚禮系草,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唆涝。我一直安慰自己找都,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布廊酣。 她就那樣靜靜地躺著能耻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啰扛。 梳的紋絲不亂的頭發(fā)上嚎京,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音隐解,去河邊找鬼鞍帝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛煞茫,可吹牛的內(nèi)容都是我干的帕涌。 我是一名探鬼主播摄凡,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蚓曼!你這毒婦竟也來(lái)了亲澡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纫版,失蹤者是張志新(化名)和其女友劉穎床绪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體其弊,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡癞己,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梭伐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痹雅。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖糊识,靈堂內(nèi)的尸體忽然破棺而出绩社,到底是詐尸還是另有隱情,我是刑警寧澤赂苗,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布愉耙,位于F島的核電站,受9級(jí)特大地震影響哑梳,放射性物質(zhì)發(fā)生泄漏劲阎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一鸠真、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧龄毡,春花似錦吠卷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至路操,卻和暖如春疾渴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屯仗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工搞坝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魁袜。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓桩撮,卻偏偏與公主長(zhǎng)得像敦第,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子店量,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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