国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

記一次遍歷導(dǎo)致的崩潰

共 849字,需瀏覽 2分鐘

 ·

2022-03-01 14:37


題記:用最通俗的語言,描述最難懂的技術(shù)

?

本文是作者在對項目進行調(diào)試某靜態(tài)庫的功能進行單元測試發(fā)現(xiàn)的問題的記錄,如果有哪些論述模糊或者不準確,請聯(lián)系[email protected]

目錄表

  • 故事背景
  • 問題定位
  • 解決方案
  • 原理
    • copy是什么
    • copy如何實現(xiàn)
    • copy底層實現(xiàn)
  • 延展之深淺拷貝
    • 集合類對象
    • 非集合類對象
  • 參考文檔
  • 結(jié)束語

故事背景

環(huán)境及場景:

編譯環(huán)境Xcode 12.5.1

2021年8月的某一天,Augus正在調(diào)試項目需求A,因為A要求需要接入一個SDK進行實現(xiàn)某些采集功能

操作流程

  • 在程序啟動的最開始地方,初始化SDK,并分配內(nèi)存空間

  • 在某次的啟動中就出現(xiàn)了以下錯誤

    Trapped uncaught exception 'NSGenericException', reason: '*** Collection <__NSSetM: 0x2829f9740> was mutated while being enumerated.'

初步猜測

開始的時候,我先排除自己代碼的原因(畢竟代碼自己寫的,還是求穩(wěn)一些),因為調(diào)試模式下沒有開全局斷點,所以本次的崩潰就這么被錯失機會定位

為了下一次的復(fù)現(xiàn)

  • 首先進行了NSMutableSet某些方法的hook
  • 開啟全局斷點

最后定位

項目中引入SDK導(dǎo)致的崩潰

問題定位

問題原因

被引入第三方的SDK在某個邏輯中使用的NSMutableSet遍歷中對原可變集合進行同時讀寫的操作

復(fù)現(xiàn)同樣崩潰的場景,Let's do it

?NSMutableSet?*mutableSet?=?[NSMutableSet?setWithObjects:@"1",@"2",@"3",?nil];
????
?for?(NSString?*item?in?mutableSet)?{
?????if?([item?integerValue]?3)?{
?????????[mutableSet?removeObject:item];
??????}
??}

控制臺日志

很好,現(xiàn)在已經(jīng)知道了問題的原因,那么接下來解決問題就很容易了,讓我們繼續(xù)

解決方案

問題原因總結(jié)

不能在一個可變集合,包括NSMutableArray,NSMutableDictionary等類似對象遍歷的同時又對該對象進行添加或者移除操作

解決問題

把遍歷中的對象進行一次copy操作


其實其中的道理很簡單,我現(xiàn)在簡而概括

你在內(nèi)存中已經(jīng)初始化一塊區(qū)域,而且分配了地址,那么系統(tǒng)在這次的遍歷中會把這次遍歷包裝成原子操作,因為會可能會訪問壞內(nèi)存或者越界的問題,當然這也是出于安全原因,不同的系統(tǒng)下的實現(xiàn)方式不同,但是底層的原理是一致的,都是為了保護對象在操作過程中不受可變因素的更新

那問題來了

  • copy是什么?
  • copy在底層如何實現(xiàn)?
  • copy有哪些需要注意的?
?

帶著這些疑問,我們繼續(xù)下面的閱讀,相信你讀完肯定會柳暗花明又一村...

原理

copy是什么

copyObjective-C編程語言下的屬性修飾關(guān)鍵詞,比如修飾Block orNS*開頭的對象

copy如何實現(xiàn)

對需要實現(xiàn)的類遵守NSCopying協(xié)議

實現(xiàn)NSCopying協(xié)議,該協(xié)議只有一個方法

-?(id)copyWithZone:(NSZone?*)zone;

舉例說明,首先我們新建一個Perosn類進行說明,下面是示例代碼

//?The?person.h?file
#import?

NS_ASSUME_NONNULL_BEGIN

@interface?Person?:?NSObject<NSCopying>

-?(instancetype)initWithName:(NSString?*)name;

@property(nonatomic,?copy)?NSString?*name;


///?To?update?internal?mutabl?set?for?adding?a?person
///?@param?person?A?instance?of?person
-?(void)addPerson:(Person?*)person;


///?To?update?internal?mutbable?set?for?removing?a?person
///?@param?person?A?instance?of?person
-?(void)removePerson:(Person?*)person;


@end

NS_ASSUME_NONNULL_END
??
//?The?person.m?file
#import?"Person.h"

@interface?Person?()

@property(nonatomic,?strong)?NSMutableSet?*friends;

@end

@implementation?Person

#pragma?mark?-?Initalizaiton?Methods

-?(instancetype)initWithName:(NSString?*)name?{
????self?=?[super?init];
????if?(!self)?{
????????return?nil;
????}
???if(!name?||?name.length?1)?{
???????name?=?@"Augus";
????}
????_name?=?name;
????
????//?Warn:?Do?not?self.persons?way?to?init.?But?do?u?know?reason?
????_friends?=?[NSMutableSet?set];
????return?self;
}


#pragma?mark?-?Private?Methods

-?(void)addPerson:(Person?*)person?{
????
????//?Check?param?safe
????if?(!person)?{
????????return;
????}
????
????[self.friends?addObject:person];
????
????
}

-?(void)removePerson:(Person?*)person?{
????
????if?(!person)?{
????????return;
????}
????
????[self.friends?removeObject:person];
}


#pragma?mark?-?Copy?Methods

-?(id)copyWithZone:(NSZone?*)zone?{
????
????//?need?copy?object
????Person?*copy?=?[[Person?allocWithZone:zone]?initWithName:_name];
????
????return?copy;
}

-?(id)deepCopy?{
????Person?*copy?=?[[[self?class]?alloc]?initWithName:_name];
????copy->_persons?=?[[NSMutableSet?alloc]?initWithSet:_friends?copyItems:YES];
????return?copy;
}


#pragma?mark?-?Lazy?Load

-?(NSMutableSet?*)friends?{
????if?(!_friends)?{
????????_friends?=?[NSMutableSet?set];
????}
????return?_friends;
}

@end

類的功能很簡單,初始化的時候需要外層傳入name進行初始化,如果name非法則進行默認值的處理

  • 類內(nèi)部維護了一個可變集合用來存放好友
  • 外部提供了新增和移除的兩個方法
  • - (id)copyWithZone:(NSZone *)zone;中的實現(xiàn)就是簡單的一個copy功能
  • deepCopy是對可變集合的深層復(fù)制,至于原因,我們會在延展中舉例說明,這里先擱置

copy底層實現(xiàn)

之前的文檔中說過,想要看底層的實現(xiàn)那就用clang -rewrite-objc main.m看源碼

為了方便測試和查看,我們新建一個TestCopy的類繼承NSObject,然后在TestCopy.m中只加如下代碼

#import?"TestCopy.h"

@interface?TestCopy?()

@property(nonatomic,?copy)?NSString?*augusCopy;

@end

@implementation?TestCopy

@end

然后在終端執(zhí)行$ clang -rewrite-objc TestCopy.m命令

接下來我們進行源碼分析

//?augusCopy's?getter?function
static?NSString?*?_I_TestCopy_augusCopy(TestCopy?*?self,?SEL?_cmd)?{?return?(*(NSString?**)((char?*)self?+?OBJC_IVAR_$_TestCopy$_augusCopy));?}

//?augusCopy's?setter?function
static?void?_I_TestCopy_setAugusCopy_(TestCopy?*?self,?SEL?_cmd,?NSString?*augusCopy)?{?objc_setProperty?(self,?_cmd,?__OFFSETOFIVAR__(struct?TestCopy,?_augusCopy),?(id)augusCopy,?0,?1);?}

總結(jié):copygetter是根據(jù)地址偏移找到對應(yīng)的實例變量進行返回,那么objc_setProperty又是怎么實現(xiàn)的呢?

objc_setProperty.cpp中沒有找到,在[Apple源碼](鏈接附文后)中找到了答案,我們來看下

//?self:?The?current?instance
//?_cmd:?The?setter's?function?name
//?offset:?The?offset?for?self?that?find?the?instance?property
//?newValue:?The?new?value?that?outer?input
//?atomic:?Whether?atomic?or?nonatomic,it?is?nonatomic?here
//?shouldCopy:?Whether?should?copy?or?not
void?
objc_setProperty(id?self,?SEL?_cmd,?ptrdiff_t?offset,?id?newValue,?
?????????????????BOOL?atomic,?signed?char?shouldCopy)
?
{
????objc_setProperty_non_gc(self,?_cmd,?offset,?newValue,?atomic,?shouldCopy);
}

void?objc_setProperty_non_gc(id?self,?SEL?_cmd,?ptrdiff_t?offset,?id?newValue,?BOOL?atomic,?signed?char?shouldCopy)?
{
????bool?copy?=?(shouldCopy?&&?shouldCopy?!=?MUTABLE_COPY);
????bool?mutableCopy?=?(shouldCopy?==?MUTABLE_COPY);
????reallySetProperty(self,?_cmd,?newValue,?offset,?atomic,?copy,?mutableCopy);
}

看到內(nèi)部又調(diào)用了objc_setProperty_non_gc方法,這里主要看下這個方法內(nèi)部的實現(xiàn),前五個參數(shù)和開始的傳入一致,最后的兩個參數(shù)是由shouldCopy決定,shouldCopy在這里是0 or 1,我們現(xiàn)考慮當前的情況,

  • 如果shouldCopy=0,那么copy=NO,mutableCopy=NO
  • 如果shouldCopy=1,那么copy=YES,mutableCopy=NO

下面繼續(xù)reallySetProperty的實現(xiàn)

static?inline?void?reallySetProperty(id?self,?SEL?_cmd,?id?newValue,?ptrdiff_t?offset,?bool?atomic,?bool?copy,?bool?mutableCopy)
{
????id?oldValue;
????id?*slot?=?(id*)?((char*)self?+?offset);

????if?(copy)?{
????????newValue?=?[newValue?copyWithZone:NULL];
????}?else?if?(mutableCopy)?{
????????newValue?=?[newValue?mutableCopyWithZone:NULL];
????}?else?{
????????if?(*slot?==?newValue)?return;
????????newValue?=?objc_retain(newValue);
????}

????if?(!atomic)?{
????????oldValue?=?*slot;
????????*slot?=?newValue;
????}?else?{
????????spin_lock_t?*slotlock?=?&PropertyLocks[GOODHASH(slot)];
????????_spin_lock(slotlock);
????????oldValue?=?*slot;
????????*slot?=?newValue;????????
????????_spin_unlock(slotlock);
????}

????objc_release(oldValue);
}

基于本例子中的情況,copy=YES,最后還是調(diào)用了newValue = [newValue copyWithZone:NULL];,如果copy=NO and mutableCopy=NO,那么最后會調(diào)用newValue = objc_retain(newValue);

objc_retain的實現(xiàn)

id?objc_retain(id?obj)?{?return?[obj?retain];?}

總結(jié):用copy修飾的屬性,賦值的時候,不管本身是可變與不可變,賦值給屬性之后的都是不可變的

延展之深淺拷貝

非集合類對象

在iOS下我們經(jīng)常聽到深拷貝(內(nèi)容拷貝)或者淺拷貝(指針拷貝),對于這些操作,我們將針對集合類對象和非集合類對象進行copymutableCopy實驗

類簇:Class Clusters

  • an architecture that groups a number of private, concrete subclasses under a public, abstract superclass. (一個在共有的抽象超類下設(shè)置一組私有子類的架構(gòu))

  • Class cluster 是 Apple 對抽象工廠設(shè)計模式的稱呼。使用抽象類初始化返回一個具體的子類的模式的好處就是讓調(diào)用者只需要知道抽象類開放出來的API的作用,而不需要知道子類的背后復(fù)雜的邏輯。驗證結(jié)論過程的類簇對應(yīng)關(guān)系請看這篇 [Class Clusters 文檔](鏈接附文后)。

NSString

NSString?*str?=?@"augusStr";
NSString?*copyAugus?=?[str?copy];
NSString?*mutableCopyAugus?=?[str?mutableCopy];
????
NSLog(@"str:(%@<%p>:?%p):?%@",[str?class],&str,str,str);
NSLog(@"copyAugus?str:(%@<%p>:?%p):?%@",[copyAugus?class],©Augus,copyAugus,copyAugus);
NSLog(@"mutableCopyAugus?str:(%@<%p>:?%p):?%@",[mutableCopyAugus?class],&mutableCopyAugus,mutableCopyAugus,mutableCopyAugus);

//?控制臺輸出
2021-09-03?14:51:49.263571+0800?TestBlock[4573:178396]?augus?str(__NSCFConstantString<0x7ffee30a1008>:?0x10cb63198):?augusStr
2021-09-03?14:51:49.263697+0800?TestBlock[4573:178396]?copyAugus?str(__NSCFConstantString<0x7ffee30a1000>:?0x10cb63198):?augusStr
2021-09-03?14:51:49.263808+0800?TestBlock[4573:178396]?mutableCopyAugus?str(__NSCFString<0x7ffee30a0ff8>:?0x6000036bcfc0):?augusStr
?

__NSCFConstantString是字符串常量類,可看作NSString,__NSCFString是字符串類,可看作NSMutableString

結(jié)論:strcopyAugus打印出來的內(nèi)存地址是一樣的,都是0x10cb63198且類名相同都是__NSCFConstantString,表明都是淺拷貝,都是NSString;變量mutableCopyAugus打印出來的內(nèi)存地址和類名都不一致,所以是生成了新的對象

類名操作新對象拷貝類型元素拷貝新類名
NSStringcopyNO淺拷貝NONSString

mutableCopyYES深拷貝NONSMutableString

NSMutableString

NSMutableString?*str?=?[NSMutableString?stringWithString:@"augusMutableStr"];
NSMutableString?*copyStr?=?[str?copy];
NSMutableString?*mutableCopyStr?=?[str?mutableCopy];


NSLog(@"str:(%@<%p>:?%p):?%@",[str?class],&str,str,str);
NSLog(@"copyStr:?(%@<%p>:?%p):?%@",[copyStr?class],©Str,copyStr,copyStr);
NSLog(@"mutableCopyStr:?(%@<%p>:?%p):?%@",[mutableCopyStr?class],&mutableCopyStr,mutableCopyStr,mutableCopyStr);

//?控制臺輸出
2021-09-03?15:31:56.105642+0800?TestBlock[4778:198224]?str:(__NSCFString<0x7ffeeaa34008>:?0x600001a85fe0):?augusMutableStr
2021-09-03?15:31:56.105804+0800?TestBlock[4778:198224]?copyStr:?(__NSCFString<0x7ffeeaa34000>:?0x600001a86400):?augusMutableStr
2021-09-03?15:31:56.105901+0800?TestBlock[4778:198224]?mutableCopyStr:?(__NSCFString<0x7ffeeaa33ff8>:?0x600001a86070):?augusMutableStr

結(jié)論:strcopyStrmutableCopyStr打印出來的內(nèi)存地址都不一樣的,但是生成的類簇都是__NSCFString,也就是NSMutableString

類名操作新對象拷貝類型元素拷貝新類名
NSMutableStringcopyYES深拷貝NONSMutableString

mutableCopyYES深拷貝NONSMutableString

集合類對象

?

因為本文對NSMutableSet展開討論,所以只對該類進行測試,其余的NSArray&NSMutableArrayNSDictionary&NSMutableDictionary本質(zhì)是一樣的,請小伙伴自行參考測試就行

NSSet

Person?*p1?=?[[Person?alloc]?init];
Person?*p2?=?[[Person?alloc]?init];
Person?*p3?=?[[Person?alloc]?init];

NSSet?*set?=?[[NSSet?alloc]?initWithArray:@[p1,p2,p3]];
NSSet?*copySet?=?[set?copy];
NSSet?*mutableCopySet?=?[set?mutableCopy];

NSLog(@"set:(%@<%p>:?%p):?%@",[set?class],&set,set,set);
NSLog(@"copySet:?(%@<%p>:?%p):?%@",[copySet?class],©Set,copySet,copySet);
NSLog(@"mutableCopySet:?(%@<%p>:?%p):?%@",[mutableCopySet?class],&mutableCopySet,mutableCopySet,mutableCopySet);
????
//?控制臺輸出
2021-09-03?16:11:36.590338+0800?TestBlock[4938:219837]?set:(__NSSetI<0x7ffeef3f7fd0>:?0x6000007322b0):?{(
????0x600000931e00>,
????0x600000931e20>,
????0x600000932000>
)}
2021-09-03?16:11:36.590479+0800?TestBlock[4938:219837]?copySet:?(__NSSetI<0x7ffeef3f7fc8>:?0x6000007322b0):?{(
????0x600000931e00>,
????0x600000931e20>,
????0x600000932000>
)}
2021-09-03?16:11:36.590614+0800?TestBlock[4938:219837]?mutableCopySet:?(__NSSetM<0x7ffeef3f7fc0>:?0x600000931fa0):?{(
????0x600000931e00>,
????0x600000932000>,
????0x600000931e20>
)}
?

__NSSetI是不可變?nèi)ブ責(zé)o序集合的子類,即NSSet,__NSSetM是可變?nèi)ブ責(zé)o序集合的子類,即NSMutableSet

結(jié)論:setcopySet打印出來的內(nèi)存地址是一致的0x6000007322b0,類簇都是__NSSetI說明是淺拷貝,沒有生成新對象,也都屬于類 NSSet;mutableCopySet的內(nèi)存地址和類簇都不同,所以是深拷貝,生成了新的對象,屬于類NSMutablSet;集合里面的元素地址都是一樣的

類名操作新對象拷貝類型元素拷貝新類名
NSSetcopyNO淺拷貝NONSSet

mutableCopyYES深拷貝NONSMutablSet

NSMutableSet

NSMutableSet?*set?=?[[NSMutableSet?alloc]?initWithArray:@[p1,p2,p3]];
NSMutableSet?*copySet?=?[set?copy];
NSMutableSet?*mutableCopySet?=?[set?mutableCopy];

NSLog(@"set:(%@<%p>:?%p):?%@",[set?class],&set,set,set);
NSLog(@"copySet:?(%@<%p>:?%p):?%@",[copySet?class],©Set,copySet,copySet);
NSLog(@"mutableCopySet:?(%@<%p>:?%p):?%@",[mutableCopySet?class],&mutableCopySet,mutableCopySet,mutableCopySet);
?
?//?控制臺輸出
2021-09-03?16:33:35.573557+0800?TestBlock[5043:232294]?set:(__NSSetM<0x7ffeefb78fd0>:?0x600002b99640):?{(
????0x600002b99620>,
????0x600002b99600>,
????0x600002b995e0>
)}
2021-09-03?16:33:35.573686+0800?TestBlock[5043:232294]?copySet:?(__NSSetI<0x7ffeefb78fc8>:?0x6000025e54a0):?{(
????0x600002b99620>,
????0x600002b99600>,
????0x600002b995e0>
)}
2021-09-03?16:33:35.573778+0800?TestBlock[5043:232294]?mutableCopySet:?(__NSSetM<0x7ffeefb78fc0>:?0x600002b99680):?{(
????0x600002b99620>,
????0x600002b99600>,
????0x600002b995e0>
)}

結(jié)論:setcopySetmutableCopySet的內(nèi)存地址都不一樣,說明操作都是深拷貝;集合里面的元素地址都是一樣的

類名操作新對象拷貝類型元素拷貝新類名
NSMutableSetcopyYES深拷貝NONSSet

mutableCopyYES深拷貝NONSMutablSet

結(jié)論分析

  • NSMutable*開頭的類不要用copy屬性去修飾,因為每次賦值操作拷貝出來的都是不可變集合類
  • 集合類的copymutableCopy操作,對象里面的元素不會發(fā)生拷貝,只會對容器層面拷貝,也稱之為單層深拷貝

參考文檔

  • 文檔0:https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Collections/Articles/Copying.html#//apple_ref/doc/uid/TP40010162-SW8
  • 文檔1:https://gist.github.com/Catfish-Man/bc4a9987d4d7219043afdf8ee536beb2
  • 文檔2:https://opensource.apple.com/source/objc4/objc4-723/runtime/objc-accessors.mm.auto.html
  • Apple源碼:https://opensource.apple.com/source/objc4/objc4-723/runtime/objc-accessors.mm.auto.html
  • Class Clusters 文檔:https://gist.github.com/Catfish-Man/bc4a9987d4d7219043afdf8ee536beb2

結(jié)束語

一次崩潰定位,一次源碼之旅,一系列拷貝操作,基本可以把文中提到的問題說清楚;遇到問題不要怕刨根問底,因為問底的盡頭就是無盡的光明


瀏覽 67
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 俺来了俺去也| 啊啊啊av| 91无码人妻精品一区二区三区四| 西西444大胆无码视频| 成人视频网站在线观看| 久久99综合| 成人三级片免费| 日本中文字幕免费| 亚洲精品久久久久毛片A级绿茶| 日本欧美成人片AAAA| 奇米四色秒播| 无码视频在线| 五月丁香| 人妻视频在线| A黄色片| 能看的AV网站| 麻豆成人精品国产免费| 成人A∨| 人妻一区二区在线| 夜夜bb| 国产性爱图| 色婷婷亚洲| 日韩免费一级片| 黄色成人网站免费在线观看| 美女白嫩嫩大BBB欣赏| 台湾精品无码| 暖暖日本在线| 国产一级二级三级片| 人妻中文字幕av| 国产欧美在线免费观看| 成人国产精品在线观看| 最新版本日本亚洲色| 日韩无码视频一区| 成人黄片网站| 色色亚洲| 果冻传媒一区二区三区| 欧美日韩爱爱| 无码中文字幕在线视频| 色欲欲www成人网站| 无码一区二区高清| 99在线观看免费| 欧美日韩在线视频免费播放| 激情A| 污污污污污www网站免费民国| 91夫妻交友视频| 青娱乐超碰| 亚洲少妇视频| 欧美日韩国产一区二区三区| 亚洲精品456| 成人一级黄片| 国产日韩欧美综合在线| 91在线成人| 亚洲免费观看高清完整版| 欧美日韩一级毛| 无码一区二区高清| 蜜桃人妻无码AV天堂三区| www.有码99| 国产aaaaaaaaaaaaa| 九色偷拍| 亚洲性爱综合| 亚洲美女网站在线观看| 国产成人精品视频免费看| 女人的天堂AV在线观看| 欧美视频一区| 成人在线网站| 五月婷婷六月丁香| 欧美日韩国产尤物主播精品| 韩国高清无码60.70.80| 在线免费观看黄色视频| 日韩性爱网站| 国产av高清| 日韩一级A片| 中文字幕在线观看一区| AV解说| 亚洲天堂在线免费观看| www.狠狠操| 欧美精产国品一二三区| www.俺去也| 小骚逼操死你| 欧美一级内射| 91av在线看| 日韩欧美黄色| 国产又粗又长| 有码中文字幕| 色男人的天堂| 日本在线播放| 国产精品一麻了麻了| 强开小嫩苞一区二区三区视频| 色情一级AA片免费观看| japanese在线观看| 成人免费操| 国产xxxx视频| 国产成人秘在线观看免费网站| 国产91丝袜在线播放| 福利视频中文字幕| 99久久人妻精品免费二区| 免费一级欧美片在线观看| 免费的黄色录像| 亚洲日本三级片| 激情开心五月天| 亚洲视频免费在线| 国产三级片在线免费观看| 中文av在线播放| 少妇在线| 内射视频在线观看| 操比视频| 人人操超碰| 激情一区| 亚洲无码aa| 婷婷五月在线播放| 久久精品性爱| 9一区二区三区| 熟女内射| 91人妻人人澡人人爽人人玩| 国产午夜激情视频| 亚洲精品成人无码AV在线| 成人日皮视频| 99re这里| www.99视频| 中文字幕第6页| 图片区视频区小说区| 黄片入口| 激情无码视频| 性视频人人| 日韩视频免费看| 免费无遮挡视频网站视频| 噼里啪啦免费观看视频大全| 人妻少妇偷人精品久久| 97大香蕉在线视频| 玖玖资源站中文字幕| 中文字幕第69页| 91丨国产丨精品丨丝袜| 日韩城人免费| 国产A片| 国产成人宗合| 中文字幕在线播放AV| 欧美老妇XX| 欧美+日韩+国产+成人+在线| 狠狠躁日日躁夜夜躁A片男男视频| 亚洲欧美不卡| 簧片网站在线观看| 一道本一区二区| 91探花足浴店少妇在线| 亚洲无码久久久| 天天色伊人| 亚洲成人77777| 五月丁香激情在线| 国产精品高清无码| 色汉综合| 国产欧美日韩在线观看| 黄色片免费观看| 国产黄色AV片| 亚洲色激情| 91久久婷婷亚洲精品成人| 尤物在线免费视频| 欧美v| 国产V片| 日韩婷婷| 肏婷婷| 国产一区亚洲| 久久久久久久9999| 大香蕉尹人在线观看| 午夜成人视频在线观看| 日逼综合网| 奇米影视亚洲春色| 色老板在线视频| 国产精品毛片VA一区二区三区| sm国产在线调教视频| 2026国产精品视频| 大香蕉手机在线视频| 91人人爽| 成人免费区一区二区三区| 91在线成人视频| 青青草狠狠干| 成人久久久久一级大黄毛片中国 | 久久久91人妻无码精品蜜桃ID| 国产av三级| 综合AV| 日本黄色视频在线播放| 偷偷操穴| 16一17女人毛片| 亚洲成人在线观看视频| 天天干视频在线| 亚洲成人免费网站| 国产精品大香蕉| 成人午夜A片免费看| 4388亚洲最大| 人妻AV一区| 91在线无精精品秘白丝| 特级西西人体WWWww| 无码视频在线播放| 国产精品视频久久久久| 天天操夜夜干| 深爱五月激情网| 大肉大捧一进一出两腿| 国产熟女一区二区三区五月婷 | 免费在线国产| 猛男大粗猛爽H男人味| 翔田千里无码播放| aa无码| 色mm在线播放| xxxx日韩| 五月天乱伦小说| 7799精品| 日本高清一区二区高清免费视频| 国产成人电影一区二区| 安徽妇搡BBBB搡BBBB按摩| 俺去俺来也www色官网cms| 中国女人操逼视频| 国产盗摄AV| 亚洲无码中| 欧美日韩毛片| 91精品久久人妻一区二区夜夜夜| 亚洲AV偷拍| 精品视频99| 91五月天| 婷婷精品秘进入| AAA成人| 91人妻在线视频| 久热中文字幕| 男女AV在线免费观看| 一级性爱毛片| 日本乱伦中文字幕| 一本大道香蕉av久久精东影业| 国产夫妻露脸| 亚洲日韩视频在线播放| 色婷婷电影| 国产AV无遮挡| 国产精品毛片一区二区在线看| 黑人狂躁女人高潮视频| 超碰人妻在线| 国外操逼视频| 成人福利在线观看| 国产精品福利视频| 欧美区在线观看| 黄色片无码| 中文字幕+乱码+中文乱码电影| 99re国产| 大香蕉久在线| 精品孕妇孕交无码专区| 六月色婷婷| 久草中文在线视频| 熟妇槡BBBB槡BBBB图| 第一福利视频导航| 国产成人精品视频免费看| 在线成人AV| 人人肏人人摸| 91双飞会所双飞在线| 成人H在线| 91网站免费看| 特级西西人体444WWw高清大胆| 日本有码中文字幕| 一道本高清无码视频| 少妇一区二区三区| 91视频首页| 毛片毛片毛片毛片毛片| 精品视频久久| 亚洲天堂在线免费观看视频| 中文字幕欧美视频| 丁香六月| 亚洲无码少妇| 91人妻人人澡人人爽人人精品乱 | 超碰天天射| 日韩成人高清| 久久久9999| 亚洲AV无码精品岛国| 日本免费无码| 强奸乱伦制服丝袜| 婷婷在线影院| 无码骚逼| 江苏妇搡BBBB搡BBBB-百度| 国产伦精品一级A片视频夜夜| 国产日韩欧美综合在线| 亚洲任你操超碰在线| 国产在线观看你懂的| 亚洲视频中文字幕在线观看| 大香蕉最新国产2025| 色欲av网站| 日韩一级免费毛片| 按摩性高湖婬AAA片A片中国| 麻豆一区在线观看| 搡BBB| 97天天操| 国产精品久久久久久久久夜色| 日韩一级一片| 精品一区二区三区四| 亚洲女人被黑人巨大进入| 老司机在线免费视频| h亚洲| www.婷婷| 天堂网2018| 欧美成人三级在线观看| 午夜免费播放观看在线视频| 校园春色亚洲无码| 香蕉伊人网| www.jiujiujiu| 亚洲无码精品一区二区| 国产一区二区免费看| 大炕上公让我高潮了六次| 无码三级在线观看| 五月精品在线| 99热免费观看| 六月丁香久久| 无码专区在线观看| 亚洲第一黄色| a级片在线观看| 黄片AAA| 日韩精品网址| 中文字幕日韩视频| 精品视频久| 亚洲av偷拍| 黄色激情网站| 可以免费观看的毛片| 久久人妻熟女中文字幕av蜜芽 | 成人视频你懂的| 九一精品| 奥门黄片| 在线观看91| 玖玖资源在线观看| 日韩精品电影| 欧美性爱内射| 国产视频二区| 无码精品人妻一区二区| 2018人人操| 高清av免费| 2026国产精品视频| 人人操人人| 色色激情五月天| 91免费观看视频| 中国a一片一级一片| 99久视频| 综合黄色| 国产一级片免费观看| 久久久久亚洲AV成人片乱码| 色综合一区二区| 久久人妻视频| 久久av片| 欧美视频在线免费| 九色PORN视频成人蝌蚪自拍| 欧美美女视频网站| 国产69精品久久久久久| 色青娱乐| 91在线无码精品秘入口男同| 思思久久高颜值| 懂色AV一区二区三区国产中文在线 | 亚洲美女视频网| 日韩精品一区在线观看| 9l视频自拍蝌蚪9l视频成人| 青草无码视频| 黄片www.| 日韩成人无码电影| 欧美老妇大BBBBXXXX| 亚洲无码精品在线观看| 中国极品少妇XXX| 欧美日本在线观看| 欧美老妇XX| 一级欧美日韩| xxxx日韩| 久草免费在线视频| 波多野结衣AV在线观看| 九九国产视频| 亚洲AV秘无码不卡在线观看 | 青草青青视频| 中文字幕日韩视频| 国产精品一卡二卡三卡| 国产女人18毛片精品18水| 霸道总裁雷总各种姿势白浆爱情岛论坛 | 玩弄大荫蒂视频| 亚洲性爱视频在线观看| 天堂网一区二区三区| 91亚洲电影| 日本色区| 亚洲一区二区无码| 青青草成人在线观看| 成人片成人网久久蜜桃臀| 伊人综合视频| 日韩精品久| 久久一二三区| 欧美性受XXXX黑人XYX性爽一| 久久久噜噜噜久久中文字幕色伊伊 | 国产性色| 波多野结衣大战黑人| 日韩精品| 欧美日韩中文| 国产寡妇亲子伦一区二区三区四区 | 久久黄色大片| 日韩一a| 欧美日韩免费一区二区三区| 色噜噜网站| 国产AV三级片| 午夜特片| 国内操B电影| 精品孕妇孕交无码专区| 69av视频在线观看| 亚洲国产精品久久| 国产一级二级三级久久久| 国产福利av| 色色色热| 看一级黄色毛片| 精品四区| 骚BBBB槡BBB槡BBB| 亚洲精品在线视频| 欧美熟妇一区二区三区| 久久丁香五月婷婷五月天激情视频| 韩国中文无码| 国产婷婷内射| 一级片无码| 国产网友自拍| 91乱伦| 大地影院资源官网| 国产精品色情A级毛片| 国产精品久久视频| av女人的天堂| 伊人色色视频| 日韩欧美精品在线观看| 精品国产AV无码一区二区三区 | 日韩中文字幕免费在线观看| 国产黄色视频观看| 欧美视频免费在线观看| 亚洲AV无码成人精品一区| 精品一区二区三区四区| 中文无码一区二区三区| 日韩AV网站在线观看| 欧美性爱中文字幕| 狠狠色五月亚洲91| 这里视频很精彩免费观看电视剧最新| 婷婷五月在线观看| 猛男大粗猛爽H男人味| 北条麻妃一区二区三区-免费免费高清观看 | 日韩,变态,另类,中文,人妻| 国产欧美综合视频| 国产激情视频在线播放| 国精自拍| 九七影院第二页| 亚洲日韩视频在线| 日韩无码人妻一区| 91网站18| 视频在线观看一区| 99精品视频在线免费观看| 性爱免费视频| 91精品久久久久久久久| 在线日韩国产| 另类天堂| 特级毛片WWW| 人妻操逼视频| 毛片A级成人片| 黄色A片一级| 欧美大黄视频| 一区二区三区视频| 毛片3| 国产香蕉视频在线播放| 国产AV自拍-久| 五十路AV| 人人人人人人操| 日韩人妻电影| 人妻FrXXeeXXee护士| 激情免费网站| 日韩精品一区二区三免费视频| 亲子乱AⅤ一区二区三区| 成人毛片18女人毛片真水| 国产性精品| 99自拍视频| 天堂一区二区18| 大BBBw大BBBW另类| 麻豆精品| 亚洲va中文字幕| 国产3p露脸普通话对白| 三级视频在线播放| 安微妇搡BBBB搡BBBB日| 在线观看免费欧美操逼视频 | 乱码少妇| 亚洲欧美日韩另类| 少妇熟女视频一区二区三区| 国产伦子伦一级A片免费看小说| 日本无码视频在线| 黄色片久久久| 大香蕉在线观看视频| 免费在线A| 成人免费视频国产在线观看| 亚洲视频观看| 五月婷婷日韩| 久久久久久久国产| 黄片二区| AV在线影院| 欧美日韩一级毛| 青青草视频免费观看| 性爱午夜视频| 少妇一区二区三区| 久操热| 五月婷婷激情综合| 熟妇人妻久久中文字幕| 亚洲区视频| 色激情五月天| 亚洲成人无码视频在线观看| 91视频在线免费观看app| 日本成人性爱视频网站一区| h片免费在线观看| 亚洲成人影片在线观看| 91视频免费| 黄色大片在线免费观看| 国产剧情在线| 在线内射| 2025无码视频| 激情小说在线观看| 日p视频在线观看| A亚洲天堂| 九九视频免费在线观看| 黄色理论片| 日本色电影在线观看| 久久久久99精品成人片直播| av大香蕉| 今天成全在线观看高清| 一级欧美| 久操成人| 神马午夜精品91| 草久在线观看| 影音先锋AV成人| 人人妻人人澡人人爽久久con| 日韩视频免费| 国产成人高潮毛片| 黄色视频在线观| 婷婷国产成人精品视频| 日本天堂网站| 国产激情网站| 亚洲无码视频在线看| 亚洲成人AV无码| 日本有码在线| 91爱爱·com| 精品一区二区三区四区学生| 黄色av免费看| 亚洲高清国产欧美综合s8| www.俺去也| 亚洲AV无码成人精品区国产| 亚洲天堂精品在线观看| 久热国产视频| 大香蕉三级片| 你懂的在线观看| 精品无码电影| 中文字幕精品无码一区二区| 欧美黄片免费在线观看| 久久久91精品国产一区苍井空| 亚洲国产成人91精品| 人人爱人人摸人人操| 亚洲A片电影| 超碰免费99| 伊人成人免费视频| www黄色片| 国产精品九九九九九九| 免费在线观看无码| 想要xx视频| 91大神在线观看入口| 亚洲中文字墓| 亚洲国产激情视频| 裸体美女视频欧美18| 大香蕉在线啪啪| 动漫啪啪视频| 97人妻人人澡人人爽人人| AV四虎| 免费在线观看视频黄| 亚洲中文字幕视频在线| 青娱乐成人在线| 一级一级一级做a免费一级做a| 国产成人精品123区免费视频| 无码插逼| 国产V片| 激情视频网址| 久久一级片| 秋霞一区二区三区无码| 亚洲精品性爱| 午夜成人国产| 国产丰满大乳无码免费播放| 色婷婷色婷婷| 久久午夜无码鲁丝| 国产香蕉av| 91成人导航| 人人操夜夜操| 五月天婷婷影院| 中文字幕操逼网站| 欧美熟女一区二区| 黄色视频在线观看大全| 激情播播网| 天堂一区二区18| 亚洲午夜福利在线| 久久精品三级| 日本精品人妻无码77777| 久久丁香五月婷婷五月天激情视频| 国产特黄| 黄色大片免费网站| 麻豆精品国产传媒| 色屁屁草草影院ccyycom| 亚洲无码一区二区三区| 日韩三级在线| 亚洲中文字幕在线观看视频| 夜色321| 日韩乱伦网站| 亚洲视频五区| 国产真实露脸乱子伦对白高清视频| 国产无套视频| 亚洲成人一区二区| 国产18女人水真多免费看| 免费无码婬片AAAAA片| 粉嫩av一区二区白浆| 国产香蕉精品视频| 久色国产| 91综合网| 一本色道久久88综合无码| 日本在线观看www| 人妻天天操| 三级片小说| 手机AV在线| 伊人激情影院| 亚洲乱伦图| 西西人体444rt高清大胆模特 | 无码免费一区二区三区| 91精品国产乱码久久久| 狠狠色噜噜狠狠狠888米奇视频| 麻豆精品一区| 免费的黄色视频| 中文字幕高清| 国产精品高清网站| 大香蕉免费在线观看| 国产婷婷色一区二区在线观看| 亚洲欧美成人在线| 欧美黄片区| 国产在线视频网站| 日韩一级高清| 日本黄色免费视频| 三级高清无码视频| 日本黄色视频免费| 亚洲性视频| 亚州无码| 免费爱爱视频网站| 麻豆黄色片| 成人欧美一区二区三区黑人免费| 正在播放ADN156松下纱荣子 | 91丨露脸丨熟女精品| 337P粉嫩大胆噜噜噜55569| 成人做爰100片免费观看视频| 亚洲高清在线视频| 五月天激情啪啪| 欧美午夜伦理| 肏屄免费视频| 丰满少妇一级片| 久久伊思人在| 91成人福利| 不卡一二三区| 日本AⅤ电影| 国产精品一线| 翔田千里无码在线观看| 成年人黄色在线观看| 日韩无码www| 五月丁香啪啪啪| 北岛玲丝袜办公室高跟| 在线无码不卡| 黄片一区| 狠狠狠狠狠狠狠狠狠狠| 欧美三级片在线视频| 人人看人人摸| 艹美女视频| 91在线看片| 九九视屏| 欧美成年人视频| 亚洲成人三级片| 蜜桃人妻| 天堂а√在线中文在线新版| 中文无码字幕| 黑人一区二区三区四区| 国产一级a毛一级a做免费高清视频| 爱福利视频| AⅤ在线观看| 日日干日日| 天天色小说| AV自拍偷拍| 91丨人妻丨国产丨丝袜| 青娱乐国产av| 日本成人精品| 色av网| 你懂的网站在线观看| 青娱乐精品视频| 欧美操B在线| 影音先锋女人av噜噜色| 大鸡巴在线视频| 能看的操逼视频| 欧美图片小说| 国产成人女人在线观看| 色老板最新地址| 一道本在线视频| 激情五月天av| 日本一本草久p| 国产又粗又长| 亚洲第一狼人综合网| 日韩AV电影网| jizzjizz欧美| 午夜福利手机在线| 黄色a片视频| 9118禁| 乱伦播放五月天| 69视频在线播放| 翔田千里一区二区| 中文字幕乱码亚洲无线码在线日噜噜 | 精品人妻一区二区三区蜜桃| 午夜无码精品一区二区三区99午| 亚洲欧美激情视频| 婷婷色在线观看| 天堂无码| 91无码人妻一区二区成人aⅴ| 国产少妇| 未满十八18禁止免费无码网站| 激情小说五月天| 国产激倩都市一区二区三区欧美| 加勒比无码视频| 青青草在线视频免费观看| 国产又粗又长又硬又大毛苴茸图片 | 日韩在线视频91| 青青草免费在线视| 伊人精品在线| 色情一级A片成人片| 天啪| 91香蕉视频| 欧洲AV在线| 北条麻妃久久| 51妺嘿嘿午夜福利视频| 久久精品视频在线观看| 一本久道无码| 强伦轩人妻一区二区电影| 人人摸人人摸人人| 内射无码专区久久亚洲| 亚洲AV久久无码| 中文字幕第二页| 日韩操比视频| 三级a片| 中文字幕日韩美| 欧美大香蕉网| 国内无码自拍| 最近中文字幕免费MV第一季歌词十| 欧美性天天| 久久三级| 久久精品视频9| 青青草资源站| 91精品丝袜久久久久久久久粉嫩| 99九九99九九九99九他書對| 亚洲精品无码中文字幕| 青娱亚洲| 亚洲精品婷婷| 台湾中文字幕网| 操逼综合| 国产精品久久久久久久久久久久久久久 | 欧美久操| 无码秘蜜桃一区二区| 国产一区二区三区在线观看免费视频免费视频免费视频 | 天码人妻一区二区三区在线看| 国产免费看| 国产成人视频免费观看| 日韩精品一区二区三区在线观看免费 | 91久九九| 久久狠| 欧美日韩大香蕉| 日日综合网| 乱婬妺妺躁爽A片| 成年人黄色视频网站| 午夜做爱福利视频| 国产成人无码精品久在线观看| 国产超碰在线| 五月婷婷色播| 欧美h| 国产无套视频| 蜜桃人妻无码AV天堂三区| 日韩一级片在线观看| 偷拍亚洲天堂| 四色五月婷婷| 黄色A片网站| 噜噜噜在线视频| 人妻少妇91精品一区黑人 | 蜜臀av在线免费观看| 青草午夜| 国产精品A片守望| AV电影一区| 日韩人妻无码精品| 婷婷五月丁香色| 波多一区| 欧美狠狠干| 欧美性综合| 最近中文字幕无码| 三级乱伦86丝袜无码| 日韩免费观看视频| 激情另类视频| 人人干人人操人人爽| 麻豆人妻换人妻好紧| 成人性爱视频在线播放| 欧美操B在线| 亚洲久久视频| 三级国产AV| 香蕉国产在线| 成人大香蕉| 人人爽夜夜爽| 日韩精品视频一区二区三区| 久久影院三级片| 日日夜夜干| 丁香五月天AV| 国产乱伦内射视频| 成人无码小电影| 国产精品无码专区| 高清中文字幕在线A片| 一级a片在线免费观看| 大香蕉久久草| 91丨九色丨熟女丰满| 特写毛茸茸BBwBBwBBw| 国产精品9999久久久久仙踪林| 午夜无码人妻AV| 日韩成人观看| 精品国产一| 婷婷色777777| 中文字幕一区二区久久人妻| 日韩亚洲在线观看| 嗯啊在线视频| 特级WWW444至码| 亚洲五月天在线| 日本电影一区二区三区| 人人妻人人做| 99在线视频观看| 亚洲骚逼| 久久久夜夜夜| 日韩美女久久| AV中文字幕电影| 国产三四区久久| 国产乱轮视频| 91成人导航| 国产第一夜| 婷婷深爱激情| 未满十八18禁止免费无码网站 | 亚洲精品人伦一区二区| 国产精品久久久久久无码人妻| 无码秘蜜桃一区二区三区| 日韩AV毛| 99热大香蕉| 国产一页| 韩日无码视频| 午夜在线观看视频| 香蕉视频日韩| 亚洲中文无码在线观看| 亚洲影院中文字幕| 97超碰碰| 北条麻妃91| 国产8区| 欧美一级爱| 蜜臀久久精品久久久久| 久久天堂av| 国产主播av| 久久91| 天天干天天添| 蜜桃秘av一区二区三区安全| 黄色片一区二区| 日韩无码不卡视频| 国产深喉视频| 九七在线视频| 高清免费在线中文Av| 国产乱伦精品视频| www伦理片-韩国三级三级三级a三级-成人AV | 亚洲日韩欧美中在线| 国产精品久久久久久婷婷天堂| 国产亚洲视频免费观看| 在线观看免费高清无码| 一级黄色录相片| www.国产豆花精品区| 国产日韩欧美在线观看| 欧美不卡| 日本无码视频在线观看| 18岁毛片| 亚洲视频中文字幕在线观看| 超碰在线观看免费| 亚洲乱伦图片| 亚洲激情内射| 久久6精品| 四虎成人电影| 中文字幕无码在线观看视频| 18害羞勿进网站国产| 91亚洲国产精品| 黄色操B视频| 国产精品一区二区免费| 久久伊人在| 天天做天天日| 超碰碰人人| 国产一二三四| 国产精品伦子伦免费视频| 国产女人18毛片水18精品软件| 精品无码在线观看视频| 丁香花在线小说免费阅读| 免费看三级网站| 天天夜夜爽| 日本熟妇HD| 国产91免费视频| 亚洲一区黄色| 在线看片国产| 久久久久三级| 亚洲色图狠狠撸| 双飞少妇| 亚洲婷婷在线| 狠狠躁日日躁夜夜躁A片无码视频 强伦轩一区二区三区四区播放方式 | 秋霞午夜视频| 特级西西444WWW视频|