UITableView優(yōu)化思路與復(fù)用

單元格復(fù)用問題 ? ?demo 點(diǎn)擊此處下載

UITableView最核心的思想就是UITableViewCell的重用機(jī)制。簡(jiǎn)單的理解就是:UITableView一開始只會(huì)創(chuàng)建屏幕上要顯示的Cell,每當(dāng)Cell滑出屏幕時(shí)署驻,就會(huì)放入到一個(gè)叫“重用池”的里面,滑動(dòng)中當(dāng)要顯示某一位置的Cell時(shí)鸯匹,會(huì)先去“重用池”取渺氧,如果有洞渔,就直接拿來(lái)顯示嫂沉;如果沒有稽寒,才會(huì)創(chuàng)建。這樣做的好處就是極大的減少了內(nèi)存的開銷趟章,不需要每個(gè)都創(chuàng)建了杏糙。那么我們首先對(duì)復(fù)用進(jìn)行一個(gè)探究(以下探究方法是當(dāng)初剛學(xué)習(xí)OC時(shí)候網(wǎng)上受到的啟發(fā),自己按照這個(gè)思路嘗試)蚓土。


// 方法1

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"qwer"];

if (!cell) {

cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"qwer"];

}


// 方法2(xib)宏侍,在GLImageCell.xib文件中identifier中輸入GLImageCell,在GLImageCell.m中復(fù)寫initWithStyle reuseIdentifier方法? 復(fù)寫內(nèi)容見demo(loadNibNamed的方法)

GLImageCell *cell = [tableView dequeueReusableCellWithIdentifier:@"GLImageCell"];

if (nil == cell) {

cell = [[GLImageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"GLImageCell"];

}


// 方法3

Method3Cell *cell = [tableView dequeueReusableCellWithIdentifier:@"method3"];

if (nil == cell) {

cell = [[[NSBundle mainBundle]loadNibNamed:@"Method3Cell" owner:self options:nil]lastObject];

?cell.selectionStyle=UITableViewCellSelectionStyleNone;

?[tableView registerNib:[UINib nibWithNibName:@"Method3Cell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"method3"];

}

return cell;


// 方法4

1.在viewdidload方法里面

UINib *firstNib = [UINib nibWithNibName:@"Method3Cell" bundle:nil];

[_tableView registerNib:firstNib forCellReuseIdentifier:@"Method3"];

2.在 dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath方法中

Method3Cell *cell = [tableView dequeueReusableCellWithIdentifier:@"Method3" forIndexPath:indexPath];


//在以下方法中這么寫

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

static int myCount = 0; ? ? ? //static變量只是在編譯時(shí)候進(jìn)行初始化

TableViewCell *cell;

cell = [tableView dequeueReusableCellWithIdentifier:@"test"];

if (nil == cell) {

// 此處調(diào)用方法1北戏,2负芋,3,4進(jìn)行測(cè)試

myCount ++;

NSLog(@"count :%d ",myCount);

}

return cell;

}

測(cè)試輸出結(jié)果如下

//方法1 ?輸出為1,2,3,4,5,6,7,8,9 ??

//方法2 ?輸出為1,2,3,4,5,6,7,8,9

//方法3 ?輸出為1

//方法4 ?輸出為 ? ? ? ? ? ? ? (就是不輸出)


為什么會(huì)這樣嗜愈?首先我們大膽猜測(cè)一下是不是這樣的:方法1和方法2是因?yàn)橐婚_始都沒有對(duì)應(yīng)這個(gè)Identifier的cell,所以每次都進(jìn)入if(cell==nil)方法里面莽龟。方法3是因?yàn)榈谝淮螞]有找到對(duì)應(yīng)Identifier的cell蠕嫁,于是進(jìn)入if(cell==nil)里面,然后調(diào)用的注冊(cè)方法毯盈,所以只輸出一個(gè)數(shù)剃毒。方法4是因?yàn)樵谧铋_始就已經(jīng)注冊(cè)過,所以不會(huì)進(jìn)入if里面,所以就沒有輸出赘阀。

我們先來(lái)看這句 dequeueReusableCellWithIdentifier 是什么意思益缠,我們查看官方文檔

網(wǎng)上翻譯一下大致意思:

出于性能的原因,一個(gè)表視圖的數(shù)據(jù)源應(yīng)該采用可復(fù)用的表視圖單元對(duì)象基公。一個(gè)表視圖維護(hù)著一個(gè)可復(fù)用單元的隊(duì)列或者列表幅慌。當(dāng)要顯示一個(gè)新的單元的時(shí)候就調(diào)用這個(gè)方法,這個(gè)方法會(huì)出列一個(gè)已經(jīng)存在的單元轰豆。假如沒有可以復(fù)用的單元那么就返回nil胰伍。

從表視圖的生命周期來(lái)說,一開始可復(fù)用隊(duì)列為空酸休,調(diào)用dequeueReusableCellWithIdentifier:肯定返回nil骂租。然后就調(diào)用initWithStyle:reuseIdentifier:方法來(lái)產(chǎn)生并且標(biāo)識(shí)復(fù)用記號(hào)的表視圖單元。滿屏顯示的時(shí)候斑司,滾動(dòng)表視圖渗饮,一側(cè)的單元就會(huì)被移出屏幕,此時(shí)這個(gè)單元進(jìn)入可復(fù)用單元隊(duì)列宿刮,然后調(diào)用prepareForReuse方法準(zhǔn)備一個(gè)即將出列的單元抽米, dequeueReusableCellWithIdentifier:從可復(fù)用單元隊(duì)列里出列一個(gè)可復(fù)用單元。

//修改一下例子

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

static int myCount = 0;? ? ? //static變量只是在編譯時(shí)候進(jìn)行初始化

TableViewCell *cell;

cell = [tableView dequeueReusableCellWithIdentifier:@"test"];

if (nil == cell) {

// 此處調(diào)用方法1糙置,2云茸,3,4進(jìn)行測(cè)試

myCount ++;

NSLog(@"count :%d ",myCount);

}

//第二種輸出

NSLog(@"+++++++++before:%@",cell.textLabel.text);

cell.textLabel.text = [NSString stringWithFormat:@"%ld",(long)indexPath.row];

NSLog(@"---------after:%@",cell.textLabel.text);

輸出結(jié)果

/* 方法3的第二種輸出

2016-09-08 16:49:18.066 TableViewTest[43861:2739078] time : 1

2016-09-08 16:49:18.068 TableViewTest[43861:2739078] +++++++++before:(null)

2016-09-08 16:49:18.068 TableViewTest[43861:2739078] ---------after:0

2016-09-08 16:49:18.071 TableViewTest[43861:2739078] +++++++++before:(null)

2016-09-08 16:49:18.071 TableViewTest[43861:2739078] ---------after:1

2016-09-08 16:49:18.072 TableViewTest[43861:2739078] +++++++++before:(null)

2016-09-08 16:49:18.072 TableViewTest[43861:2739078] ---------after:2

2016-09-08 16:49:18.072 TableViewTest[43861:2739078] +++++++++before:(null)

2016-09-08 16:49:18.073 TableViewTest[43861:2739078] ---------after:3

2016-09-08 16:49:18.073 TableViewTest[43861:2739078] +++++++++before:(null)

2016-09-08 16:49:18.073 TableViewTest[43861:2739078] ---------after:4

2016-09-08 16:49:18.074 TableViewTest[43861:2739078] +++++++++before:(null)

2016-09-08 16:49:18.098 TableViewTest[43861:2739078] ---------after:5

2016-09-08 16:49:18.099 TableViewTest[43861:2739078] +++++++++before:(null)

2016-09-08 16:49:18.099 TableViewTest[43861:2739078] ---------after:6

2016-09-08 16:49:18.100 TableViewTest[43861:2739078] +++++++++before:(null)

2016-09-08 16:49:18.100 TableViewTest[43861:2739078] ---------after:7

2016-09-08 16:49:18.101 TableViewTest[43861:2739078] +++++++++before:(null)

2016-09-08 16:49:18.101 TableViewTest[43861:2739078] ---------after:8

2016-09-08 16:49:19.966 TableViewTest[43861:2739078] +++++++++before:(null)

2016-09-08 16:49:19.966 TableViewTest[43861:2739078] ---------after:9

2016-09-08 16:49:32.542 TableViewTest[43861:2739078] +++++++++before:(null)

2016-09-08 16:49:32.543 TableViewTest[43861:2739078] ---------after:10

2016-09-08 16:49:37.408 TableViewTest[43861:2739078] +++++++++before:1

2016-09-08 16:49:37.409 TableViewTest[43861:2739078] ---------after:11

*/

/*方法1谤饭,方法2标捺,方法4的第二種輸出

2016-09-08 16:53:31.731 TableViewTest[43916:2742025] time : 1

2016-09-08 16:53:31.734 TableViewTest[43916:2742025] +++++++++before:(null)

2016-09-08 16:53:31.735 TableViewTest[43916:2742025] ---------after:0

2016-09-08 16:53:31.736 TableViewTest[43916:2742025] time : 2

2016-09-08 16:53:31.736 TableViewTest[43916:2742025] +++++++++before:(null)

2016-09-08 16:53:31.737 TableViewTest[43916:2742025] ---------after:1

2016-09-08 16:53:31.737 TableViewTest[43916:2742025] time : 3

2016-09-08 16:53:31.738 TableViewTest[43916:2742025] +++++++++before:(null)

2016-09-08 16:53:31.738 TableViewTest[43916:2742025] ---------after:2

2016-09-08 16:53:31.738 TableViewTest[43916:2742025] time : 4

2016-09-08 16:53:31.738 TableViewTest[43916:2742025] +++++++++before:(null)

2016-09-08 16:53:31.739 TableViewTest[43916:2742025] ---------after:3

2016-09-08 16:53:31.739 TableViewTest[43916:2742025] time : 5

2016-09-08 16:53:31.740 TableViewTest[43916:2742025] +++++++++before:(null)

2016-09-08 16:53:31.740 TableViewTest[43916:2742025] ---------after:4

2016-09-08 16:53:31.740 TableViewTest[43916:2742025] time : 6

2016-09-08 16:53:31.741 TableViewTest[43916:2742025] +++++++++before:(null)

2016-09-08 16:53:31.741 TableViewTest[43916:2742025] ---------after:5

2016-09-08 16:53:31.742 TableViewTest[43916:2742025] time : 7

2016-09-08 16:53:31.742 TableViewTest[43916:2742025] +++++++++before:(null)

2016-09-08 16:53:31.742 TableViewTest[43916:2742025] ---------after:6

2016-09-08 16:53:31.743 TableViewTest[43916:2742025] time : 8

2016-09-08 16:53:31.743 TableViewTest[43916:2742025] +++++++++before:(null)

2016-09-08 16:53:31.744 TableViewTest[43916:2742025] ---------after:7

2016-09-08 16:53:31.744 TableViewTest[43916:2742025] time : 9

2016-09-08 16:53:31.745 TableViewTest[43916:2742025] +++++++++before:(null)

2016-09-08 16:53:31.745 TableViewTest[43916:2742025] ---------after:8

2016-09-08 16:53:38.519 TableViewTest[43916:2742025] time : 10

2016-09-08 16:53:38.519 TableViewTest[43916:2742025] +++++++++before:(null)

2016-09-08 16:53:38.519 TableViewTest[43916:2742025] ---------after:9

2016-09-08 16:53:38.604 TableViewTest[43916:2742025] +++++++++before:0

2016-09-08 16:53:38.605 TableViewTest[43916:2742025] ---------after:10

2016-09-08 16:53:38.688 TableViewTest[43916:2742025] +++++++++before:1

2016-09-08 16:53:38.689 TableViewTest[43916:2742025] ---------after:11

2016-09-08 16:53:38.740 TableViewTest[43916:2742025] +++++++++before:2

2016-09-08 16:53:38.740 TableViewTest[43916:2742025] ---------after:12

2016-09-08 16:53:38.808 TableViewTest[43916:2742025] +++++++++before:3

2016-09-08 16:53:38.808 TableViewTest[43916:2742025] ---------after:13

*/

方法3中,可復(fù)用的cell的text從1開始揉抵,從xib中創(chuàng)建的第一個(gè)cell亡容,它的identify還沒有注冊(cè),所以identify值沒有冤今,不能復(fù)用闺兢。復(fù)用是從第二個(gè)單元格開始

方法1,方法2,方法4中戏罢,可復(fù)用的cell從第一個(gè)單元格開始屋谭。

以上的結(jié)果跟我們一開始的猜測(cè)應(yīng)該是一樣的吧!

在標(biāo)題邊上有g(shù)ithub的demo下載地址龟糕,有需要的朋友可以下載來(lái)看一下 ??demo下載


UITableView優(yōu)化問題 ??

在實(shí)際開發(fā)中桐磁,有時(shí)候只使用單元格復(fù)用還是不夠的,在滑動(dòng)的時(shí)候也同樣會(huì)有卡頓感讲岁,那么我們?cè)撛趺崔k呢我擂?

以下是天哥根據(jù)多年網(wǎng)上的學(xué)習(xí)歸納總結(jié)的幾點(diǎn)衬以,不對(duì)的地方大家也請(qǐng)點(diǎn)出來(lái):

1.單元格復(fù)用

這個(gè)我們前面探究的時(shí)候說過了,單元格復(fù)用能有效的減少內(nèi)存的消耗校摩。單元格復(fù)用的實(shí)現(xiàn)是最簡(jiǎn)單也是最重要的看峻。

2.使用異步網(wǎng)絡(luò)請(qǐng)求,緩存圖片或者數(shù)據(jù)

如果我們要顯示的內(nèi)容跟之前的一樣衙吩,每次都要從網(wǎng)上獲取互妓,是不是很浪費(fèi)呢?我們要減少數(shù)據(jù)加載和邏輯處理的時(shí)間分井,從內(nèi)存中獲取就大大減少了這方面的消耗车猬,我們要將。現(xiàn)在被大家廣泛使用的AFNetworking就是異步網(wǎng)絡(luò)請(qǐng)求尺锚。

3. 提前計(jì)算并緩存Cell的高度

在UITableView中珠闰,運(yùn)行時(shí)首先調(diào)用的方法是”tableView:heightForRowAtIndexPath:”,如果我們?cè)谶@個(gè)方法里面進(jìn)行各種計(jì)算什么的瘫辩,將會(huì)大大增加手機(jī)的負(fù)擔(dān)伏嗜。所以,我們盡量能不調(diào)用代理方法的就不要調(diào)用(在創(chuàng)建tableview的時(shí)候使用tableview.rowHeight來(lái)確定cell的高度)伐厌。必須調(diào)用的情況下(比如每個(gè)section所對(duì)應(yīng)的cell不一樣等等)也盡量不要在”tableView:heightForRowAtIndexPath:”這個(gè)方法中進(jìn)行一系列的計(jì)算承绸,而是提前計(jì)算好,直接將計(jì)算好的值使用到這個(gè)方法中挣轨。如果必須要在方法里面計(jì)算军熏,那要盡力做最簡(jiǎn)單的計(jì)算。

4.異步繪制

在自定義的cell中卷扮,假設(shè)工作需求里面荡澎,我們要將cell上的某個(gè)Button的邊框變成紅色并且邊框要有一點(diǎn)圓弧形。這個(gè)時(shí)候晤锹,我們對(duì)view外形的操作最好都放在類似于drawRect的方法里面摩幔。drawRect方法是異步繪制,可以大大的緩解主線程的壓力鞭铆。

5.滑動(dòng)時(shí)或衡,按需加載。圖片加載時(shí)车遂,異步加載(SDWebImage已經(jīng)實(shí)現(xiàn)了異步加載圖片封断,有興趣的朋友可以去研究一下)。

大家考慮一個(gè)場(chǎng)景艰额,如果我們滑動(dòng)的很快澄港,中間那些瞬間而過的內(nèi)容是不是不需要顯示?哪怕顯示了也沒用對(duì)吧柄沮?滑動(dòng)的那么快我們?cè)趺纯吹们迥兀克裕葱杓虞d就很重要了祖搓。我舉的例子只是其中的一種情況狱意,這里的“需”每個(gè)人都各不一樣,有些可能是希望當(dāng)滑動(dòng)停止的時(shí)候才加載圖片(如安卓版本的餓了么拯欧。但是iOS版本的餓了么并沒有做任何處理详囤,版本低點(diǎn)的iphone手機(jī)就會(huì)有卡頓感)還有百度外賣的滑動(dòng)顯示邏輯又不一樣了(安卓版本的百度外賣在滑動(dòng)時(shí),要顯示下一個(gè)圖片就慢慢加載出來(lái)镐作。iOS版本就沒做這個(gè)處理藏姐,同樣老一點(diǎn)的iphone手機(jī)也有卡頓感)這里卡頓感我都是用iphone5體驗(yàn)到的,我用iphone6s點(diǎn)外賣就沒有卡頓感该贾。按需加載最重要的一點(diǎn)是羔杨,我們充分利用好以下方法(并不絕對(duì),看每個(gè)人的需求)

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

這些方法思想就是識(shí)別UITableView禁止或者減速滑動(dòng)結(jié)束的時(shí)候杨蛋,進(jìn)行異步加載圖片兜材,快滑動(dòng)過程中,只加載目標(biāo)范圍內(nèi)的Cell逞力,這樣按需加載曙寡,極大的提高流暢度。而SDWebImage可以實(shí)現(xiàn)異步加載寇荧,與這條性能配合就完美了举庶,尤其是大量圖片展示的時(shí)候。

6.盡量減少subviews的個(gè)數(shù)和層級(jí)

有時(shí)候根據(jù)需求揩抡,我們不得不在cell上面添加button户侥,image,label捅膘,textview等等添祸。必須要加的東西,我們還是要加寻仗,但是我們盡量想辦法減少這些層級(jí)數(shù)量刃泌。如果我們對(duì)某個(gè)view設(shè)置了alpha < 1,我們應(yīng)該將這個(gè)view的opaque屬性設(shè)置為NO署尤。如果alpha = 1耙替,則設(shè)置opaque為YES。默認(rèn)情況下opaque為YES曹体。 ?原因見官方文檔俗扇,英語(yǔ)大致意思相對(duì)簡(jiǎn)單,我就不翻譯了箕别。

?

關(guān)于優(yōu)化tableview的demo是我在以前學(xué)習(xí)網(wǎng)上知識(shí)下的demo上進(jìn)行了修改并且增加了注釋后完成的铜幽,便于大家理解滞谢。優(yōu)化方法很多,這并不是最好的優(yōu)化除抛,但是可以給大家做一個(gè)參考狮杨。 ? ? ?優(yōu)化demo下載 ? ??

感謝大家的支持,zty能力有限到忽。也感謝那些網(wǎng)上給予參考和啟發(fā)的文章橄教。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市喘漏,隨后出現(xiàn)的幾起案子护蝶,更是在濱河造成了極大的恐慌,老刑警劉巖翩迈,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件持灰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡帽馋,警方通過查閱死者的電腦和手機(jī)搅方,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绽族,“玉大人姨涡,你說我怎么就攤上這事“陕” “怎么了涛漂?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)检诗。 經(jīng)常有香客問我匈仗,道長(zhǎng),這世上最難降的妖魔是什么逢慌? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任悠轩,我火速辦了婚禮,結(jié)果婚禮上攻泼,老公的妹妹穿的比我還像新娘火架。我一直安慰自己,他們只是感情好忙菠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布何鸡。 她就那樣靜靜地躺著,像睡著了一般牛欢。 火紅的嫁衣襯著肌膚如雪骡男。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天傍睹,我揣著相機(jī)與錄音隔盛,去河邊找鬼犹菱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛骚亿,可吹牛的內(nèi)容都是我干的已亥。 我是一名探鬼主播熊赖,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼来屠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了震鹉?” 一聲冷哼從身側(cè)響起俱笛,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎传趾,沒想到半個(gè)月后迎膜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浆兰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年磕仅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片簸呈。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡榕订,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜕便,到底是詐尸還是另有隱情劫恒,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布轿腺,位于F島的核電站两嘴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏族壳。R本人自食惡果不足惜憔辫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仿荆。 院中可真熱鬧贰您,春花似錦、人聲如沸赖歌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)庐冯。三九已至孽亲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間展父,已是汗流浹背返劲。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工玲昧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篮绿。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓孵延,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親亲配。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尘应,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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