精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS手動打造JSON Model轉換庫

移動開發 iOS
前一段時間學習了Runtime,對類和對象的結構,和一些消息轉發有一些自己的理解,現在希望簡單的應用下,就決定自己寫一個簡單的JSON與Model的相互轉化,現在總結下。

 觀察下面這個JSON數據和Model數據

  1. NSString *girlFriend = @"白菜";  
  2. id parmenters = @{  
  3.         @"girlFriend":girlFriend,  
  4.         @"age":@22.1,  
  5.         @"name":@"Lastdays",  
  6.         @"time":@"2016-03-18 5:55:49 +0000"  
  7. }; 
  1. @interfaceModel: NSObject  
  2.    
  3. @property NSNumber *age;  
  4. @property NSString *name;  
  5. @property NSString *girlFriend;  
  6. @property NSData *time;  
  7.    
  8. @end 

開始的時候仔細想了一下,如何能夠動態的去添加屬性值,并且根據對應的屬性進行賦值,還要保證類型正確,這是我最開始考慮的問題。但是最核心問題就是 動態實現 。

我們一步一步來解決問題,首先我們先獲取Model屬性,取得Model的一些信息
獲取Model屬性

runtime提供了 class_copyPropertyList 來獲取屬性列表,OK,我們可以來看一下用它獲取的數據是什么樣的?查看runtime源碼

  1. /***********************************************************************  
  2. * class_copyPropertyList. Returns a heap block containing the  
  3. * properties declared in the class, or nil if the class  
  4. * declares no properties. Caller must free the block.  
  5. * Does not copy any superclass's properties.  
  6. **********************************************************************/  
  7. objc_property_t*class_copyPropertyList(Class cls, unsigned int *outCount)  
  8. {  
  9.     old_property_list*plist;  
  10.     uintptr_titerator = 0;  
  11.     old_property**result = nil;  
  12.     unsigned int count = 0;  
  13.     unsigned int p, i;  
  14.    
  15.     if (!cls) {  
  16.         if (outCount) *outCount = 0;  
  17.         return nil;  
  18.     }  
  19.    
  20.     mutex_locker_tlock(classLock);  
  21.    
  22.     iterator = 0;  
  23.     while ((plist = nextPropertyList(cls, &iterator))) {  
  24.         count += plist->count;  
  25.     }  
  26.    
  27.     if (count > 0) {  
  28.         result = (old_property**)malloc((count+1) * sizeof(old_property*));  
  29.    
  30.         p = 0;  
  31.         iterator = 0;  
  32.         while ((plist = nextPropertyList(cls, &iterator))) {  
  33.             for (i = 0; i < plist->count; i++) {  
  34.                 result[p++] = property_list_nth(plist, i);  
  35.             }  
  36.         }  
  37.         result[p] = nil;  
  38.     }  
  39.    
  40.     if (outCount) *outCount = count;  
  41.     return (objc_property_t*)result;  
  1. typedef struct old_property*objc_property_t; 
  1. struct old_property {  
  2.     const char *name;  
  3.     const char *attributes;  
  4. }; 

從上面的三段runtime源碼中,課本上就能判斷出,其實返回結果就是一些old_property,并且每個old_property中含有對應的name和其他信息。

總結起來說就是**class_copyPropertyList**獲取Model屬性列表,屬性列表里面的objc_property_t包含著這個屬性的類型和名字等一些信息。

根據剛才的分析設計出以下結構:

  1. bash  
  2. -(id)modelToJsonObject:(NSObject *)model{  
  3.    
  4.     Class cls = self.class;  
  5.     unsigned int countProperty = 0;  
  6.     objc_property_t*propertys = class_copyPropertyList(cls,&countProperty);  
  7.     NSMutableDictionary *dic = [NSMutableDictionary new];  
  8.    
  9.     for (unsigned int i = 0; i<countProperty; i++) {  
  10.         PropertyInfo *propertyInfo = [[PropertyInfo alloc]initWithProperty:propertys[i]];  
  11.         if (propertyInfo.propertyName!=nil) {  
  12.             dic[propertyInfo.propertyName] = [selfLYModelSetJsonObjectWith:modelpropertyInfo:propertyInfo];  
  13.         }  
  14.     }  
  15.     return dic;  

PropertyInfo也就是屬性信息,我們將Model的所有屬性存放到 NSMutableDictionary 中,key就是屬性名,Value就是PropertyInfo。

接下來開始獲取Model的屬性信息 PropertyInfo

我們可以通過property_getName來獲取屬性名

  1. const char *property_getName(objc_property_tprop)  
  2. {  
  3.     return oldproperty(prop)->name;  

接下來就是獲取屬性的類型和一些其他的信息。獲取屬性的信息其實和上面的原理差不多,我們使用property_copyAttributeList,

  1. objc_property_attribute_t*property_copyAttributeList(objc_property_tprop,   
  2.                                                       unsigned int *outCount)  
  3. {  
  4.     if (!prop) {  
  5.         if (outCount) *outCount = 0;  
  6.         return nil;  
  7.     }  
  8.    
  9.     mutex_locker_tlock(classLock);  
  10.     return copyPropertyAttributeList(oldproperty(prop)->attributes,outCount);  

看到這里,不往下繼續分析源碼了,其實可以看到,attributes就是我們想要的信息,其實每個property也是有自己對應的attributes。

這個attributes是什么樣呢?翻看源碼,找到了答案

  1. typedef struct {  
  2.     const char *name;        
  3.     const char *value;          
  4. } objc_property_attribute_t; 

加一下斷點,看看

可以看到,name是T,Value是NSNumber,我們來獲取下NSNumber這個屬性類型。

  1. for (unsigned int i = 0; i<attrCount; i++) {  
  2.     if (attrs[i].name[0] == 'T') {  
  3.         size_tlen = strlen(attrs[i].value);  
  4.         if (len>3) {  
  5.             char name[len - 2];  
  6.             name[len - 3] = '';  
  7.             memcpy(name, attrs[i].value + 2, len - 3);  
  8.             _typeClass = objc_getClass(name);  
  9.         }  
  10.     }  

基本上我們想要的信息基本上都已經獲取到了,現在接下來就是做動態設定。

中間做個插曲簡單的說下Objc是動態語言,[receiver message]的執行過程當中,[receiver message]是會被動態編譯的,Objc是動態語言,因此它會想盡辦法將編譯連接推遲到運行時來做。runtime這個時實運行系統就是來執行編譯后的代碼。

在這個消息發送過程中,objc_msgSend充當著很重要的角色,所以我們可以主動觸發objc_msgSend,來模擬getter,setter方法獲取屬性值,或者建立。

我們通過SEL來定義選擇器,選擇器是什么?就是方法名的唯一標識符

根據剛才的想法,編寫的代碼***是這個樣子

  1. -(instancetype)initWithProperty:(objc_property_t)property{  
  2.     _property = property;  
  3.    
  4.     const char *name = property_getName(property);  
  5.     if (name) {  
  6.         _propertyName = [NSStringstringWithUTF8String:name];  
  7.     }  
  8.     unsigned int attrCount;  
  9.     objc_property_attribute_t*attrs = property_copyAttributeList(property, &attrCount);  
  10.     for (unsigned int i = 0; i<attrCount; i++) {  
  11.         if (attrs[i].name[0] == 'T') {  
  12.             size_tlen = strlen(attrs[i].value);  
  13.             if (len>3) {  
  14.                 char name[len - 2];  
  15.                 name[len - 3] = '';  
  16.                 memcpy(name, attrs[i].value + 2, len - 3);  
  17.                 _typeClass = objc_getClass(name);  
  18.             }  
  19.         }  
  20.     }  
  21.     NSString *setter = [NSStringstringWithFormat:@"set%@%@:", [_propertyNamesubstringToIndex:1].uppercaseString, [_propertyNamesubstringFromIndex:1]];  
  22.     _setter =  NSSelectorFromString(setter);  
  23.     _getter = NSSelectorFromString(_propertyName);  
  24.    
  25.     return self;  

基本的準備工作,和一些問題都解決了,接下來可以寫功能了。
JSON轉Model

根據剛才說的,我們可以主動觸發objc_msgSend,來模擬setter方法建立屬性值。設計出以下方法

  1. -(void)LYModelSetPropertyWithModel:(id) modelvalue:(id)valuepropertyInfo:(PropertyInfo *) propertyInfo{  
  2.     ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)model, propertyInfo.setter, value);  

我們將Model的所有屬性存放到 NSMutableDictionary 中,key就是屬性名,Value就是PropertyInfo。

現在就可以動態設定了

  1. -(BOOL)LYModelSelectProperties:(NSDictionary *)dictonary{  
  2.    
  3.     ClassInfo *cls = [[ClassInfo alloc]initWithClass:object_getClass(self)];  
  4.     id key, value;  
  5.     NSArray *keys = [dictonaryallKeys];  
  6.     NSUInteger count = [keyscount];  
  7.     for (int i = 0; i < count; i++){  
  8.         key = [keysobjectAtIndex: i];  
  9.         value = [dictonaryobjectForKey: key];  
  10.    
  11.         if (cls.propertyInfo[key]) {  
  12.             [selfLYModelSetPropertyWithModel:selfvalue:valuepropertyInfo:cls.propertyInfo[key]];  
  13.         }  
  14.     }  
  15.     return YES;  

完成動態設定
Model轉JSON

原理跟JSON轉Model

我們可以主動觸發objc_msgSend,來模擬getter方法來獲取屬性值。

  1. -(id)LYModelSetJsonObjectWith:(id)modelpropertyInfo:(PropertyInfo *)propertyInfo{  
  2.     id value = ((id (*)(id, SEL))(void *) objc_msgSend)((id)model, propertyInfo.getter);  
  3.     return value;  

建立NSDictionary

  1. -(id)modelToJsonObject:(NSObject *)model{  
  2.    
  3.     Class cls = self.class;  
  4.     unsigned int countProperty = 0;  
  5.     objc_property_t*propertys = class_copyPropertyList(cls,&countProperty);  
  6.     NSMutableDictionary *dic = [NSMutableDictionary new];  
  7.    
  8.     for (unsigned int i = 0; i<countProperty; i++) {  
  9.         PropertyInfo *propertyInfo = [[PropertyInfo alloc]initWithProperty:propertys[i]];  
  10.         if (propertyInfo.propertyName!=nil) {  
  11.             dic[propertyInfo.propertyName] = [selfLYModelSetJsonWith:modelpropertyInfo:propertyInfo];  
  12.         }  
  13.     }  
  14.     return dic;  

完成獲取
測試

  1. NSString *girlFriend = @"白菜";  
  2.     id parmenters = @{  
  3.                       @"girlFriend":girlFriend,  
  4.                       @"age":@22.1,  
  5.                       @"name":@"Lastdays",  
  6.                       @"time":@"2016-03-18 5:55:49 +0000"  
  7.                       };  
  8.    
  9.     Model *model = [ModelLYModelWithJSON:parmenters];  
  10.     NSLog(@"%@",model.girlFriend);  
  11.     NSLog(@"%@",model.name);  
  12.     NSLog(@"%@",model.age);  
  13.     NSLog(@"%@",model.time);  
  14.    
  15.     NSLog(@"========================================");  
  16.    
  17.     NSDictionary *jsonObject= [modelLYModelToJson];  
  18.     NSLog(@"%@",jsonObject); 

結果:

總結

簡單的JSON Model轉換庫,關鍵點就是在于對runtime的理解。就當自己的一個小練習,后續會繼續維護,讓它對更多類型進行支持。代碼結構上可能不是那么好,后續會將整體的結構重新設計下,增加可讀性,也歡迎來提出建議。

責任編輯:陳琳 來源: 伯樂在線
相關推薦

2016-11-29 10:20:50

SwiftJSONModel工具庫

2015-10-28 09:55:39

Swift解析生產庫

2011-04-22 13:44:34

JacksonJSON

2010-06-30 11:16:50

SQL Server

2014-07-17 10:06:02

Model-View-iOS App

2009-06-15 15:10:02

Java數據轉換JSON

2022-10-13 21:07:48

數據庫SQL Server

2015-08-07 09:33:24

RuntimeModel

2010-01-05 14:49:03

JSON格式

2015-11-24 09:53:22

AngularJSXMLJSON

2009-08-13 09:33:07

JavaBean到XM

2020-10-22 08:01:52

XMLJSON轉換

2010-01-08 10:49:21

JSON 轉換工具

2020-06-10 14:16:57

iOS 13.6 be蘋果更新

2021-05-27 10:02:57

Go緩存數據

2021-01-04 05:40:58

MySQL數據庫

2024-03-12 09:10:21

GoarenaAPI

2010-01-08 10:24:38

轉換JSON

2021-08-20 16:37:42

SparkSpark Strea

2024-05-16 08:28:20

類型處理器D3BootJSON
點贊
收藏

51CTO技術棧公眾號

99精品国产一区二区青青牛奶| 在线观看免费高清完整| 欧美精品18| 亚洲国产成人一区| www.四虎成人| 日韩av中文| 丁香激情综合五月| 欧美尤物巨大精品爽| 天天摸日日摸狠狠添| 日本少妇精品亚洲第一区| 欧美日韩人人澡狠狠躁视频| 亚洲va久久久噜噜噜久久狠狠| 国产黄色片免费| 久久成人在线| 久久色在线播放| 黄色污在线观看| 视频精品导航| 亚洲一区国产视频| 四虎一区二区| 亚洲aaaaaaa| 老鸭窝一区二区久久精品| 欧美激情欧美狂野欧美精品| 2019男人天堂| 欧美电影免费网站| 91精品国产麻豆| 狠狠操精品视频| 97人澡人人添人人爽欧美| ...中文天堂在线一区| 久久婷婷国产综合尤物精品| www.四虎在线观看| 日本免费在线视频不卡一不卡二| 97婷婷涩涩精品一区| 日本黄色录像视频| 国产尤物久久久| 亚洲精品白浆高清久久久久久| 91看片破解版| 国产一区二区主播在线| 天天影视色香欲综合网老头| 日本xxx免费| 成人性生交大片免费看午夜| 久久综合色婷婷| 国产伦精品一区二区三区视频孕妇| 中文字幕在线网址| 日韩精品一二区| 日本精品性网站在线观看| 久久视频免费在线观看| 久久精品久久久| 日韩视频―中文字幕| 久久久久无码精品国产sm果冻 | 国产精品久久9| 日韩精品久久久久久久| 欧美日韩一区自拍| 欧美成人激情视频免费观看| 天堂网avav| 一区二区三区四区在线观看国产日韩| 深夜精品寂寞黄网站在线观看| 亚洲久久久久久久| 亚洲制服一区| 亚洲午夜色婷婷在线| 熟女俱乐部一区二区视频在线| 欧美三级午夜理伦三级在线观看| 亚洲激情在线观看视频免费| 日韩Av无码精品| 欧美激情久久久久久久久久久| 亚洲激情视频在线| 国产黄色网址在线观看| 伊人久久大香线蕉综合网站| 亚洲欧美国产一本综合首页| 欧美性猛交xxxx乱| 欧美色爱综合| 久久久精品美女| 免费在线观看黄色av| 欧美视频四区| 97婷婷涩涩精品一区| 欧美一区二区激情视频| 久久精品欧洲| 国产精自产拍久久久久久| 在线观看国产精品入口男同| 激情深爱一区二区| av一区二区在线看| 四虎永久在线精品免费网址| 久久久久久久久久久黄色| 丝袜美腿玉足3d专区一区| 欧美激情视频在线播放| 亚洲影院理伦片| 99精品人妻少妇一区二区| 精品国模一区二区三区| 欧美精品久久久久久久久老牛影院| 中文字幕一区二区在线观看视频 | 欧美精品99久久久**| 中文字幕人妻无码系列第三区| 99国产精品久久一区二区三区| 国产视频一区在线| 欧美人与禽zoz0善交| 亚洲国产精品91| 97精品国产97久久久久久免费| 午夜影院免费在线观看| 久久99精品久久久久久久久久久久| 91福利视频导航| 日韩国产福利| 亚洲人成精品久久久久久| 国产视频一视频二| 日韩美女在线| 日韩成人久久久| 黄色录像一级片| 国产一区二区三区久久久久久久久| 国产精品福利在线观看网址| 亚洲国产精品一| 欧美激情一区二区三区全黄| 日韩国产小视频| 欧美日韩在线精品一区二区三区激情综合 | 日韩av新片网| 久久天堂影院| 精品亚洲一区二区| 欧美日韩国产精品综合| 日韩精品一卡二卡三卡四卡无卡| 99re视频| 久久黄色美女电影| 91精品办公室少妇高潮对白| 欧美熟妇精品一区二区| 色综合天天爱| 国产成人a亚洲精品| 丰满人妻熟女aⅴ一区| 中文子幕无线码一区tr| 99精品在线免费视频| 日韩精品一区二区三区中文在线| 影音先锋日韩有码| 天堂中文在线网| av一区二区三区在线| 黑人巨茎大战欧美白妇| 午夜精品久久久久久毛片| 亚洲色图狂野欧美| 欧美激情黑白配| aa级大片欧美| 日韩伦理在线免费观看| 久久久精品区| 久久综合久久88| 国产一区二区三区成人| 国产日韩欧美一区二区三区综合 | 老司机精品视频导航| 蜜桃日韩视频| 成人影院网站| 日韩精品免费一线在线观看| 国产极品在线播放| 国产传媒一区在线| 亚洲天堂第一区| 久久伊人久久| 米奇精品一区二区三区在线观看| 国产一区二区小视频| 欧美国产乱子伦| 国产又大又黄又粗的视频| 色综合综合色| 日韩暖暖在线视频| 国产在线视频网| 91黄色小视频| 亚洲色图欧美色| 九一九一国产精品| 日韩国产精品毛片| 精品一区二区三区免费看| 久久的精品视频| 国产精品一区二区av白丝下载| 国产精品区一区二区三| 想看黄色一级片| 欧美在线91| 91传媒免费看| 成人免费网站观看| 亚洲精品一区久久久久久| 无码人妻丰满熟妇奶水区码| 国产精品看片你懂得| 欧洲美女亚洲激情| 亚洲国产91| 免费h精品视频在线播放| 成人激情综合| 中文字幕精品视频| www日本高清| 精品久久久久人成| 国产视频三区四区| 激情综合色综合久久| 国产精品久久久久久久久电影网| 国产成人福利av| 国产精品99一区| 麻豆传媒视频在线| 亚洲成人免费网站| 日本成人一级片| 亚洲欧美乱综合| 国产精品久久久免费观看| 日本强好片久久久久久aaa| 日本丰满大乳奶| 欧洲亚洲一区二区三区| 国产精品一区久久久| 中文字幕在线三区| 亚洲欧美日韩国产中文专区| 91丨九色丨丰满| 精品久久久久久| 日韩欧美在线视频播放| 成人深夜福利app| 91日韩视频在线观看| 国产一区视频在线观看免费| 欧美中日韩免费视频| 欧美影院精品| 日本亚洲欧美三级| 七七成人影院| 中文字幕亚洲综合久久筱田步美| wwwxxxx国产| 欧美性受xxxx| 日韩精品在线不卡| 中文字幕日韩一区| 在线观看福利片| 风流少妇一区二区| 嫩草视频免费在线观看| 销魂美女一区二区三区视频在线| 日本丰满少妇黄大片在线观看| 在线一级成人| 国产主播一区二区三区四区| 国产亚洲观看| 国产精品普通话| 亚洲十八**毛片| 欧美大秀在线观看| 免费a级在线播放| 亚洲视频在线观看| 无码精品人妻一区二区| 日韩一级大片在线观看| 中文字幕 自拍偷拍| 欧美性xxxxxxxxx| 日韩久久精品视频| 一区二区三区四区乱视频| 国产jizz18女人高潮| 久久欧美中文字幕| 青青草视频网站| 成人妖精视频yjsp地址| 久久精品一卡二卡| 久久精品99久久久| 老司机午夜av| 久久人人97超碰国产公开结果| 成年人午夜视频在线观看| 国产综合亚洲精品一区二| 中文字幕第一页亚洲| 日韩理论在线| 亚洲春色在线视频| 精品久久中文| 日韩精品极品视频在线观看免费| 西野翔中文久久精品字幕| 狠狠色狠狠色综合人人| 成人免费直播在线| 国产伦精品一区二区三区免| 77成人影视| 成人av资源| 国产精品主播在线观看| 国产精品一区二区av| 成人av地址| 成人欧美一区二区三区黑人免费| 亚洲视频一起| 国产99在线免费| 色妞ww精品视频7777| 91成人理论电影| 91九色鹿精品国产综合久久香蕉| 成人欧美一区二区三区在线观看| 福利片在线一区二区| 国产一区二区三区无遮挡 | 亚洲福利在线视频| 婷婷丁香花五月天| 亚洲精品在线91| 成人在线免费电影| 日韩视频免费看| 在线观看电影av| 国自在线精品视频| 自拍偷拍欧美视频| 国产精品第100页| 亚洲欧洲专区| 成人一区二区三区四区| 日韩精品免费一区二区夜夜嗨| 欧美日韩免费高清| 日韩精品欧美| av动漫在线播放| 午夜亚洲视频| 免费成年人高清视频| 豆国产96在线|亚洲| 内射中出日韩无国产剧情| 国产调教视频一区| 唐朝av高清盛宴| 亚洲国产视频a| 波多野结衣视频网址| 7777精品久久久大香线蕉| 丁香六月色婷婷| 亚洲色图日韩av| 四虎影院观看视频在线观看| 97成人超碰免| 亚洲二区av| 国产综合精品一区二区三区| 国产一区二区三区四区五区| 欧美一级免费在线观看| 一本久道久久综合婷婷鲸鱼| 一区二区三区视频在线观看免费| 国产精品18久久久久久久久| 30一40一50老女人毛片| 亚洲欧洲制服丝袜| 久久久黄色大片| 日韩一区国产二区欧美三区| 免费观看成年在线视频网站| 九九热精品视频国产| 亚洲成av在线| 国产乱码一区| 亚洲色图插插| 一本色道无码道dvd在线观看| 国产精品一区二区不卡| 精品国产成人亚洲午夜福利| 亚洲国产日韩在线一区模特| 92久久精品一区二区| 亚洲视频第一页| 黄页网站大全在线免费观看| 国产日韩综合一区二区性色av| 久久香蕉网站| 国产欧美123| 久久精品国产一区二区三| 久久亚洲AV成人无码国产野外 | a级黄色片免费| 日本强好片久久久久久aaa| 完美搭档在线观看| 亚洲男人的天堂在线aⅴ视频| 日批视频免费观看| 亚洲欧美激情在线视频| av2020不卡| 亚洲专区在线视频| 999久久久精品国产| 国语对白做受xxxxx在线中国| 不卡一区二区中文字幕| 91视频免费在线看| 欧美一区二区在线不卡| 1pondo在线播放免费| 日本久久91av| 亚洲精品动态| 777精品久无码人妻蜜桃| 成人综合在线观看| 成人免费看片98| 日韩欧美久久久| 日韩成人伦理| yellow视频在线观看一区二区 | 国产精品专区在线| 国产成人精品三级麻豆| 91视频综合网| 欧美一区二区视频网站| 成人日批视频| 91九色极品视频| 欧美激情亚洲| 极品人妻一区二区| 亚洲精品视频一区| 精品国产无码AV| 久久久亚洲国产| 高清精品xnxxcom| 波多野结衣综合网| 2021中文字幕一区亚洲| 国产成人无码av| 在线视频欧美日韩| 日本免费在线一区| 日本免费在线视频观看| 极品少妇xxxx精品少妇| 在线看的片片片免费| 欧美一级片在线观看| 欧美色图天堂| 久久手机视频| 蜜臀av亚洲一区中文字幕| 女同久久另类69精品国产| 91精品国产综合久久香蕉麻豆| 二区三区四区高清视频在线观看| 3d动漫啪啪精品一区二区免费| 伊人激情综合| 一卡二卡三卡四卡| 欧美欧美欧美欧美| 午夜小视频福利在线观看| 国产伦精品一区二区三区免| 免费在线亚洲欧美| 国产在视频线精品视频| 欧美一区二区二区| missav|免费高清av在线看| 免费一区二区三区在在线视频| 精品国产第一福利网站| 成人精品一二区| 今天的高清视频免费播放成人| 婷婷激情综合五月天| 一区二区三区欧美在线观看| 视频一区二区三区在线看免费看| 国产成人精品久久二区二区91| 久久婷婷蜜乳一本欲蜜臀| 性折磨bdsm欧美激情另类| 偷拍一区二区三区| 国产精品一二三区视频| 一区二区在线视频播放| av日韩国产| 图片区小说区区亚洲五月| 国产成人鲁色资源国产91色综| 五月天激情国产综合婷婷婷| 在线电影院国产精品| 成人影音在线| 日本10禁啪啪无遮挡免费一区二区| 精品一区二区三区在线播放视频| 久久久视频6r| 精品久久久久久久久久久久久久久久久 | 亚洲bt欧美bt精品777| 久久婷婷五月综合色国产香蕉| 久久综合一区二区|