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

IOS團隊編程規范

移動開發 iOS
簡潔的代碼可以讓bug無處藏身。要寫出明顯沒有bug的代碼,而不是沒有明顯bug的代碼。先把眼前的問題解決掉,解決好,再考慮將來的擴展問題。

[[201429]]

前 言

需求是暫時的,只有變化才是永恒的,面向變化編程,而不是面向需求編程。

不要過分追求技巧,降低程序的可讀性。

簡潔的代碼可以讓bug無處藏身。要寫出明顯沒有bug的代碼,而不是沒有明顯bug的代碼。

先把眼前的問題解決掉,解決好,再考慮將來的擴展問題。

一、命名規范

1、統一要求

含義清楚,盡量做到不需要注釋也能了解其作用,若做不到,就加注釋,使用全稱,不使用縮寫。

2、類名

大駝峰式命名:每個單詞的首字母都采用大寫字母

==例:== MFHomePageViewController

3、私有變量

  • 私有變量放在 .m 文件中聲明
  • 以 _ 開頭,***個單詞首字母小寫,后面的單詞的首字母全部大寫。

==例:== NSString *_somePrivateVariable

4、property變量

  • 小駝峰式命名:***個單詞以小寫字母開始,后面的單詞的首字母全部大寫
  • 屬性的關鍵字推薦按照 原子性,讀寫,內存管理的順序排列。
  • Block、NSString屬性應該使用copy關鍵字
  • 禁止使用synthesize關鍵詞

==例:==

  1. typedef void (^ErrorCodeBlock) (id errorCode,NSString *message); 
  2.  
  3. @property (nonatomic, readwrite, strong) UIView *headerView; //注釋 
  4.  
  5. @property (nonatomic, readwrite, copy) ErrorCodeBlock errorBlock; //將block拷貝到堆中 
  6.  
  7. @property (nonatomic, readwrite, copy) NSString *userName;  

5、宏和常量命名

  • 對于宏定義的常量

#define 預處理定義的常量全部大寫,單詞間用 _ 分隔

宏定義中如果包含表達式或變量,表達式或變量必須用小括號括起來。

  • 對于類型常量

對于局限于某編譯單元(實現文件)的常量,以字符k開頭,例如kAnimationDuration,且需要以static const修飾

對于定義于類頭文件的常量,外部可見,則以定義該常量所在類的類名開頭,例如EOCViewClassAnimationDuration, 仿照蘋果風格,在頭文件中進行extern聲明,在實現文件中定義其值

==例:==

  1. //宏定義的常量 
  2.  
  3. #define ANIMATION_DURATION    0.3 
  4.  
  5. #define MY_MIN(A, B)  ((A)>(B)?(B):(A)) 
  6.  
  7.   
  8.  
  9. //局部類型常量 
  10.  
  11. static const NSTimeInterval kAnimationDuration = 0.3; 
  12.  
  13.   
  14.  
  15. //外部可見類型常量 
  16.  
  17. //EOCViewClass.h 
  18.  
  19. extern const NSTimeInterval EOCViewClassAnimationDuration; 
  20.  
  21. extern NSString *const EOCViewClassStringConstant;  //字符串類型 
  22.  
  23.   
  24.  
  25. //EOCViewClass.m 
  26.  
  27. const NSTimeInterval EOCViewClassAnimationDuration = 0.3; 
  28.  
  29. NSString *const EOCViewClassStringConstant = @"EOCStringConstant" 

6、Enum

  • Enum類型的命名與類的命名規則一致
  • Enum中枚舉內容的命名需要以該Enum類型名稱開頭
  • NS_ENUM定義通用枚舉,NS_OPTIONS定義位移枚舉

==例:==

  1. typedef NS_ENUM(NSInteger, UIViewAnimationTransition) { 
  2.  
  3.     UIViewAnimationTransitionNone, 
  4.  
  5.     UIViewAnimationTransitionFlipFromLeft, 
  6.  
  7.     UIViewAnimationTransitionFlipFromRight, 
  8.  
  9.     UIViewAnimationTransitionCurlUp, 
  10.  
  11.     UIViewAnimationTransitionCurlDown, 
  12.  
  13. }; 
  14.  
  15.   
  16.  
  17. typedef NS_OPTIONS(NSUInteger, UIControlState) { 
  18.  
  19.     UIControlStateNormal       = 0, 
  20.  
  21.     UIControlStateHighlighted  = 1  

7、Delegate

  • 用delegate做后綴,如
  • 用optional修飾可以不實現的方法,用required修飾必須實現的方法
  • 當你的委托的方法過多, 可以拆分數據部分和其他邏輯部分, 數據部分用dataSource做后綴. 如
  • 使用did和will通知Delegate已經發生的變化或將要發生的變化。
  • 類的實例必須為回調方法的參數之一
  • 回調方法的參數只有類自己的情況,方法名要符合實際含義
  • 回調方法存在兩個以上參數的情況,以類的名字開頭,以表明此方法是屬于哪個類的

==例:==

  1. @protocol UITableViewDataSource    
  2.  
  3. @required   
  4.  
  5. //回調方法存在兩個以上參數 
  6.  
  7. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
  8.  
  9. @optional 
  10.   
  11.  
  12. //回調方法的參數只有類自己 
  13.  
  14. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented 
  15.  
  16.  
  17. @protocol UITableViewDelegate    
  18.  
  19. @optional 
  20.   
  21.  
  22. //使用`did`和`will`通知`Delegate` 
  23.  
  24. - (nullable NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath; 
  25.  
  26. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;  

8、方法

  • 方法名用小駝峰式命名
  • 方法名不要使用new作為前綴
  • 不要使用and來連接屬性參數,如果方法描述兩種獨立的行為,使用and來串接它們。
  • 方法實現時,如果參數過長,則令每個參數占用一行,以冒號對齊。
  • 一般方法不使用前綴命名,私有方法可以使用統一的前綴來分組和辨識
  • 方法名要與對應的參數名保持高度一致
  • 表示對象行為的方法、執行性的方法應該以動詞開頭
  • 返回性的方法應該以返回的內容開頭,但之前不要加get,除非是間接返回一個或多個值。
  • 可以使用情態動詞(動詞前面can、should、will等)進一步說明屬性意思,但不要使用do或does,因為這些助動詞沒什么實際意義。也不要在動詞前使用副詞或形容詞修飾

==例:== 

  1. //不要使用 and 來連接屬性參數 
  2.  
  3. - (int)runModalForDirectory:(NSString *)path file:(NSString *)name types:(NSArray *)fileTypes;    //推薦 
  4.  
  5. - (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes;    //反對  
  6.   
  7.  
  8. //表示對象行為的方法、執行性的方法 
  9.  
  10. - (void)insertModel:(id)model atIndex:(NSUInteger)atIndex; 
  11.  
  12. - (void)selectTabViewItem:(NSTableViewItem *)tableViewItem  
  13.   
  14.  
  15. //返回性的方法 
  16.  
  17. - (instancetype)arrayWithArray:(NSArray *)array;  
  18.   
  19.  
  20. //參數過長的情況 
  21.  
  22. - (void)longMethodWith:(NSString *)theFoo  
  23.                   rect:(CGRect)theRect  
  24.               interval:(CGFloat)theInterval  
  25.  
  26.    //Implementation  
  27.    
  28.  
  29. //不要加get  
  30. - (NSSize) cellSize;  //推薦  
  31. - (NSSize) getCellSize;  //反對   
  32.  
  33. //使用情態動詞,不要使用do或does 
  34. - (BOOL)canHide;  //推薦  
  35. - (BOOL)shouldCloseDocument;  //推薦  
  36. - (BOOL)doesAcceptGlyphInfo;  //反對  

二、代碼注釋規范

優秀的代碼大部分是可以自描述的,我們完全可以用代碼本身來表達它到底在干什么,而不需要注釋的輔助。

但并不是說一定不能寫注釋,有以下三種情況比較適合寫注釋:

  • 公共接口(注釋要告訴閱讀代碼的人,當前類能實現什么功能)。
  • 涉及到比較深層專業知識的代碼(注釋要體現出實現原理和思想)。
  • 容易產生歧義的代碼(但是嚴格來說,容易讓人產生歧義的代碼是不允許存在的)。

除了上述這三種情況,如果別人只能依靠注釋才能讀懂你的代碼的時候,就要反思代碼出現了什么問題。

***,對于注釋的內容,相對于“做了什么”,更應該說明“為什么這么做”。

1、import注釋

如果有一個以上的import語句,就對這些語句進行分組,每個分組的注釋是可選的。

  1. // Frameworks  
  2. #import ;  
  3. // Models  
  4. #import "NYTUser.h"  
  5. // Views  
  6. #import "NYTButton.h"  
  7. #import "NYTUserView.h" 

2、屬性注釋

寫在屬性之后,用兩個空格隔開

==例:==

  1. @property (nonatomic, readwrite, strong) UIView *headerView; //注釋 

3、方法聲明注釋:

一個函數(方法)必須有一個字符串文檔來解釋,除非它:

  • 非公開,私有函數。
  • 很短。
  • 顯而易見。

而其余的,包括公開接口,重要的方法,分類,以及協議,都應該伴隨文檔(注釋):

  • 以/開始
  • 第二行是總結性的語句
  • 第三行永遠是空行
  • 在與第二行開頭對齊的位置寫剩下的注釋。

建議這樣寫:

  1. /This comment serves to demonstrate the format of a doc string. 
  2.  
  3.   
  4.  
  5. Note that the summary line is always at most one line long, and after the opening block comment, 
  6.  
  7. and each line of text is preceded by a single space
  8.  
  9. */  

方法的注釋使用Xcode自帶注釋快捷鍵:Commond+option+/

==例:==

  1. /** 
  2.  
  3.   
  4.  
  5. @param tableView 
  6.  
  7. @param section 
  8.  
  9. <a href='http://www.jobbole.com/members/wx1409399284'>@return</a> 
  10.  
  11. */ 
  12.  
  13. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
  14.  
  15.  
  16.     //... 
  17.  
  18.  

4、代碼塊注釋

單行的用//+空格開頭,多行的采用/* */注釋

5、TODO

使用//TODO:說明 標記一些未完成的或完成的不盡如人意的地方

==例:==

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
  2.  
  3.  
  4.     //TODO:增加初始化 
  5.  
  6.     return YES; 
  7.  
  8.  

三、代碼格式化規范

1、指針*位置

定義一個對象時,指針*靠近變量

==例:== NSString *userName;

2、方法的聲明和定義

在 - 、+和 返回值之間留一個空格,方法名和***個參數之間不留空格

==例:==

  1. - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index

3、代碼縮進

  • 不要在工程里使用 Tab 鍵,使用空格來進行縮進。在 Xcode > Preferences > Text Editing 將 Tab 和自動縮進都設置為 4 個空格
  • Method與Method之間空一行
  • 一元運算符與變量之間沒有空格、二元運算符與變量之間必須有空格

==例:== 

  1. !bValue 
  2.  
  3. fLength = fWidth * 2;   
  4.  
  5. - (void)sampleMethod1;   
  6.  
  7. - (void)sampleMethod2;  

4、對method進行分組

使用#pragma mark -對method進行分組 

  1. #pragma mark - Life Cycle Methods 
  2.  
  3. - (instancetype)init 
  4.  
  5. - (void)dealloc   
  6.  
  7. - (void)viewWillAppear:(BOOL)animated 
  8.  
  9. - (void)viewDidAppear:(BOOL)animated 
  10.  
  11. - (void)viewWillDisappear:(BOOL)animated 
  12.  
  13. - (void)viewDidDisappear:(BOOL)animated   
  14.  
  15. #pragma mark - Override Methods 
  16.  
  17. #pragma mark - Intial Methods   
  18.  
  19. #pragma mark - Network Methods   
  20.  
  21. #pragma mark - Target Methods  
  22.  
  23. #pragma mark - Public Methods   
  24.  
  25. #pragma mark - Private Methods   
  26.  
  27. #pragma mark - UITableViewDataSource   
  28.  
  29. #pragma mark - UITableViewDelegate    
  30.  
  31. #pragma mark - Lazy Loads  
  32.  
  33. #pragma mark - NSCopying    
  34.  
  35. #pragma mark - NSObject  Methods  

5、大括號寫法

對于類的method:左括號另起一行寫(遵循蘋果官方文檔)

對于其他使用場景(if,for,while,switch等): 左括號跟在***行后邊

==例:==

  1. - (void)sampleMethod 
  2.  
  3.  
  4.     BOOL someCondition = YES; 
  5.  
  6.     if(someCondition) { 
  7.  
  8.         // do something here 
  9.  
  10.     } 
  11.  
  12.  

6、property變量

==例:==

  1. @property (nonatomic, readwrite, strong) UIView *headerView; //注釋 

四、編碼規范

1、if語句

①、須列出所有分支(窮舉所有的情況),而且每個分支都須給出明確的結果。

==推薦這樣寫:==

  1. var hintStr; 
  2.  
  3. if (count < 3) { 
  4.  
  5.   hintStr = "Good"
  6.  
  7. else { 
  8.  
  9.   hintStr = ""
  10.  
  11.  

==不推薦這樣寫:==

  1. var hintStr; 
  2.  
  3. if (count < 3) { 
  4.  
  5.  hintStr = "Good"
  6.  
  7.  

②、不要使用過多的分支,要善于使用return來提前返回錯誤的情況,把最正確的情況放到***返回。

==推薦這樣寫:== 

  1. if (!user.UserName) return NO
  2.  
  3. if (!user.Passwordreturn NO
  4.  
  5. if (!user.Email) return NO  
  6.  
  7. return YES;  

==不推薦這樣寫:== 

  1. BOOL isValid = NO
  2.  
  3. if (user.UserName) 
  4.  
  5.     if (user.Password
  6.     { 
  7.         if (user.Email) isValid = YES; 
  8.     } 
  9. return isValid;  

③、條件過多,過長的時候應該換行。條件表達式如果很長,則需要將他們提取出來賦給一個BOOL值,或者抽取出一個方法

==推薦這樣寫:==

  1. if (condition1 && 
  2.  
  3.     condition2 && 
  4.  
  5.     condition3 && 
  6.  
  7.     condition4) { 
  8.  
  9.   // Do something 
  10.  
  11.  
  1. BOOL finalCondition = condition1 && condition2 && condition3 && condition4 
  2.  
  3. if (finalCondition) { 
  4.  
  5.   // Do something 
  6.  
  7.  
  8.  
  9. if ([self canDelete]){ 
  10.  
  11.   // Do something 
  12.  
  13.  
  14.   
  15.  
  16. - (BOOL)canDelete 
  17.  
  18.  
  19.     BOOL finalCondition1 = condition1 && condition2 
  20.  
  21.     BOOL finalCondition2 =  condition3 && condition4 
  22.  
  23.   
  24.  
  25.     return condition1 && condition2; 
  26.  
  27.  

==不推薦這樣寫:==

  1. if (condition1 && condition2 && condition3 && condition4) { 
  2.  
  3.   // Do something 
  4.  
  5.  

④、條件語句的判斷應該是變量在右,常量在左。

==推薦:==

  1. if (6 == count) { 
  2.  
  3.   
  4.  
  5. if (nil == object) { 
  6.  
  7.   
  8.  
  9. if (!object) { 
  10.  
  11.  

==不推薦:==

  1. if (count == 6) { 
  2.  
  3.  
  4. if (object == nil) { 
  5.  
  6.  

if (object == nil)容易誤寫成賦值語句,if (!object)寫法很簡潔

⑤、每個分支的實現代碼都須被大括號包圍

==推薦:==

  1. if (!error) { 
  2.  
  3.   return success; 
  4.  
  5.  

==不推薦:==

  1. if (!error) 
  2.   return success;  

可以如下這樣寫:

  1. if (!error) return success; 

2、for語句

①、不可在for循環內修改循環變量,防止for循環失去控制。

  1. for (int index = 0; index < 10; index++){ 
  2.    ... 
  3.    logicToChange(index
  4.  

②、避免使用continue和break。

continue和break所描述的是“什么時候不做什么”,所以為了讀懂二者所在的代碼,我們需要在頭腦里將他們取反。

其實***不要讓這兩個東西出現,因為我們的代碼只要體現出“什么時候做什么”就好了,而且通過適當的方法,是可以將這兩個東西消滅掉的:

  • 如果出現了continue,只需要把continue的條件取反即可
  1. var filteredProducts = Array() 
  2. for level in products { 
  3.     if level.hasPrefix("bad") { 
  4.         continue 
  5.     } 
  6.     filteredProducts.append(level
  7.  

我們可以看到,通過判斷字符串里是否含有“bad”這個prefix來過濾掉一些值。其實我們是可以通過取反,來避免使用continue的:

  1. for level in products {  
  2.     if !level.hasPrefix("bad") {  
  3.       filteredProducts.append(level 
  4.     }  
  5.  
  • 消除while里的break:將break的條件取反,并合并到主循環里

在while里的break其實就相當于“不存在”,既然是不存在的東西就完全可以在最開始的條件語句中將其排除。

while里的break:

  1. while (condition1) { 
  2.   ... 
  3.   if (condition2) { 
  4.     break; 
  5.   } 
  6.  

取反并合并到主條件:

  1. while (condition1 && !condition2) { 
  2. ... 
  3.  
  • 在有返回值的方法里消除break:將break轉換為return立即返回

有人喜歡這樣做:在有返回值的方法里break之后,再返回某個值。其實完全可以在break的那一行直接返回。

  1. func hasBadProductIn(products: Array) -> Bool { 
  2.     var result = false     
  3.     for level in products { 
  4.         if level.hasPrefix("bad") { 
  5.             result = true 
  6.             break 
  7.         } 
  8.     } 
  9.    return result 
  10.  

遇到錯誤條件直接返回:

  1. func hasBadProductIn(products: Array) -> Bool { 
  2.  
  3.     for level in products { 
  4.  
  5.         if level.hasPrefix("bad") { 
  6.  
  7.             return true 
  8.  
  9.         } 
  10.  
  11.     } 
  12.  
  13.    return false 
  14.  
  15.  

這樣寫的話不用特意聲明一個變量來特意保存需要返回的值,看起來非常簡潔,可讀性高。

3、Switch語句

①、每個分支都必須用大括號括起來

推薦這樣寫: 

  1. switch (integer) {    
  2.   case 1:  {  
  3.     // ...    
  4.    }  
  5.     break;    
  6.   case 2: {   
  7.     // ...    
  8.     break;  
  9.   }    
  10.   default:{  
  11.     // ...    
  12.     break;  
  13.   }  
  14.  

②、使用枚舉類型時,不能有default分支, 除了使用枚舉類型以外,都必須有default分支 

  1. RWTLeftMenuTopItemType menuType = RWTLeftMenuTopItemMain;    
  2. switch (menuType) {    
  3.   case RWTLeftMenuTopItemMain: {  
  4.     // ...    
  5.     break;  
  6.    }  
  7.   case RWTLeftMenuTopItemShows: {  
  8.     // ...    
  9.     break;  
  10.   }  
  11.   case RWTLeftMenuTopItemSchedule: {  
  12.     // ...    
  13.     break;  
  14.   }  
  15.  

在Switch語句使用枚舉類型的時候,如果使用了default分支,在將來就無法通過編譯器來檢查新增的枚舉類型了。

4、函數

①、一個函數只做一件事(單一原則)

每個函數的職責都應該劃分的很明確(就像類一樣)。

==推薦:==

  1. dataConfiguration()  
  2. viewConfiguration()  

==不推薦:==

  1. void dataConfiguration() 
  2.   ... 
  3.   viewConfiguration() 
  4.  

②、對于有返回值的函數(方法),每一個分支都必須有返回值

==推薦:== 

  1. int function() 
  2.     if(condition1){ 
  3.         return count1 
  4.     }else if(condition2){ 
  5.         return count2 
  6.     }else
  7.        return defaultCount 
  8.     } 
  9.  

==不推薦:==

  1. int function() 
  2.     if(condition1){ 
  3.         return count1 
  4.     }else if(condition2){ 
  5.         return count2 
  6.     } 

③、對輸入參數的正確性和有效性進行檢查,參數錯誤立即返回

==推薦:==

  1. void function(param1,param2) 
  2.       if(param1 is unavailable){ 
  3.            return; 
  4.       }  
  5.  
  6.       if(param2 is unavailable){ 
  7.            return; 
  8.       } 
  9.      //Do some right thing 
  10.  

④、如果在不同的函數內部有相同的功能,應該把相同的功能抽取出來單獨作為另一個函數

原來的調用:

  1. void logic() {  
  2.   a();  
  3.   b();  
  4.   if (logic1 condition) {  
  5.     c();  
  6.   } else {  
  7.     d();  
  8.   }  
  9.  

將a,b函數抽取出來作為單獨的函數

  1. void basicConfig() { 
  2.   a(); 
  3.   b(); 
  4. void logic1() { 
  5.   basicConfig(); 
  6.   c(); 
  7. void logic2() { 
  8.   basicConfig(); 
  9.   d(); 
  10.  

⑤、將函數內部比較復雜的邏輯提取出來作為單獨的函數

一個函數內的不清晰(邏輯判斷比較多,行數較多)的那片代碼,往往可以被提取出去,構成一個新的函數,然后在原來的地方調用它這樣你就可以使用有意義的函數名來代替注釋,增加程序的可讀性。

舉一個發送郵件的例子:

  1. openEmailSite(); 
  2. login();     
  3. writeTitle(title); 
  4. writeContent(content); 
  5. writeReceiver(receiver); 
  6. addAttachment(attachment); 
  7. send();  

中間的部分稍微長一些,我們可以將它們提取出來:

  1. void writeEmail(title, content,receiver,attachment) 
  2.   writeTitle(title); 
  3.   writeContent(content); 
  4.   writeReceiver(receiver); 
  5.   addAttachment(attachment); 
  6.  

然后再看一下原來的代碼:

  1. openEmailSite(); 
  2. login(); 
  3. writeEmail(title, content,receiver,attachment) 
  4. send();   
責任編輯:龐桂玉 來源: iOS大全
相關推薦

2009-08-03 17:07:13

ASP.NET編程規范

2009-08-03 16:57:42

ASP.NET編程規范

2025-03-04 13:00:00

JavaScrip代碼語言

2009-08-27 16:30:08

C#編程命名規范

2009-07-24 10:29:29

PL SQL編程規范

2012-02-02 15:04:02

軟件開發

2011-04-07 10:50:47

數據庫編程注釋規范

2012-03-22 17:16:24

Java

2011-09-26 10:50:16

JavaScript

2015-09-01 10:42:15

編程規范完全指南

2023-05-06 07:32:31

Vue項目Mixin

2022-08-19 09:12:19

數據庫開發

2025-07-18 12:42:59

2011-04-07 10:29:21

數據庫編程書寫規范

2009-11-10 15:30:46

VB.NET編程原則

2012-11-08 09:45:44

JavaScriptrequireJS

2010-03-05 11:38:40

Python編程規范

2022-04-26 18:08:21

C語言代碼編程規范

2013-05-27 11:52:16

CiscoIOS思科交換機

2023-05-11 08:01:08

Code開發保護機制
點贊
收藏

51CTO技術棧公眾號

久久综合色8888| 亚洲青色在线| 日韩一区二区高清| 久久精品xxx| 深夜福利在线视频| 蜜臀精品久久久久久蜜臀 | 亚洲欧美日本一区二区| 三级网站视频在在线播放| 91免费观看在线| 91久久精品国产91性色| 日韩免费av片| 欧美高清视频在线观看mv| 欧美成人精品1314www| 亚洲色图自拍| 少妇一区二区三区四区| 免费成人在线视频观看| 97婷婷涩涩精品一区| 天天操天天干天天操天天干| 国产精品宾馆| 制服丝袜中文字幕一区| 男女av免费观看| 污视频免费在线观看| 亚洲国产精品精华液2区45| 国产女人水真多18毛片18精品| 国产九色91回来了| 99热这里只有精品8| 久久中文久久字幕| 四季av中文字幕| 亚洲第一论坛sis| 精品剧情在线观看| 手机av在线网站| 欧美成人毛片| 在线视频你懂得一区二区三区| 欧美视频在线第一页| 永久免费在线观看视频| 成人av资源在线| 国产精品美女久久| 欧美一区二区激情视频| 日韩午夜电影| 欧美精品18videos性欧美| 69夜色精品国产69乱| 精品精品久久| 一区二区三区天堂av| 国产肉体xxxx裸体784大胆| 亚洲国产中文在线二区三区免| 欧美日韩国产一区| 欧美三级理论片| 主播大秀视频在线观看一区二区| 黑人巨大精品欧美一区免费视频 | 一区二区三区伦理片| 波多野结衣欧美| 亚洲成年人影院在线| 97精品人人妻人人| 福利电影一区| 亚洲电影在线看| 欧产日产国产精品98| 成人看片爽爽爽| 亚洲成年人在线播放| 黄色国产在线视频| 免费观看成人www动漫视频| 亚洲国产一区二区三区在线观看 | 国产精品久久久久久久久免费樱桃| 欧洲亚洲一区二区| 高清av电影在线观看| 亚洲国产精品99久久久久久久久| 日韩中文不卡| av在线1区2区| 国产精品久久久久久久久免费相片| 亚洲天堂电影网| 国内精品久久久久国产| 亚洲精品视频在线看| 久艹在线免费观看| av毛片午夜不卡高**水| 亚洲国产一区二区三区 | 中文字幕无码日韩专区免费| 66久久国产| 欧美激情亚洲自拍| 国产精品第5页| 美女视频黄久久| 7777奇米亚洲综合久久 | 99re这里只有精品视频首页| 欧美12av| 超碰免费在线播放| 亚洲成av人片一区二区| 一本久道综合色婷婷五月| 韩国女主播一区二区| 制服丝袜亚洲网站| 少妇一级淫免费观看| 久久综合色占| 欧美另类99xxxxx| 国产成人在线免费观看视频| 日韩国产欧美在线观看| 91最新国产视频| 亚洲 欧美 自拍偷拍| 中文字幕成人在线观看| av在线免费观看国产| 456亚洲精品成人影院| 91麻豆精品国产自产在线| 在线免费播放av| 久久视频在线| 2020国产精品视频| 国产av一区二区三区精品| 91蝌蚪porny九色| 一级日韩一区在线观看| 国产精品yjizz视频网| 欧美日韩在线三区| 少妇精品无码一区二区三区| 久久中文字幕二区| 日本中文字幕久久看| 国产视频一区二区三| 99国产精品久久| 日本丰满大乳奶| 欧美美女日韩| 亚洲精品成人久久| 四虎884aa成人精品| 美女精品在线| 国产精品视频免费一区| 精品自拍一区| 欧美视频自拍偷拍| 青青草视频成人| 国内精品久久久久久久影视蜜臀| 国产精品美女主播| 日本私人网站在线观看| 一区二区三区在线观看动漫| 丰满少妇在线观看| 欧美偷窥清纯综合图区| 欧美精品制服第一页| 中文字字幕在线观看| 久久久精品欧美丰满| 日韩av综合在线观看| 1313精品午夜理伦电影| 久久成人国产精品| 伊人网免费视频| 日本一区二区不卡视频| 无遮挡又爽又刺激的视频| 精品淫伦v久久水蜜桃| 欧美黄色成人网| 精品国产va久久久久久久| 亚洲精品亚洲人成人网在线播放| 看看黄色一级片| 欧美3p视频| 国产色视频一区| 色三级在线观看| 欧美色视频一区| 国产又粗又猛又爽又黄的视频四季 | 亚洲欧美在线x视频| 国产手机在线视频| 91在线精品秘密一区二区| 久久精品国产sm调教网站演员| 91综合精品国产丝袜长腿久久| 色综合视频一区中文字幕| 国产99久一区二区三区a片| 一区二区高清免费观看影视大全| 欧美又黄又嫩大片a级| 影视一区二区| 成人激情直播| 国精一区二区三区| 亚洲精品v天堂中文字幕| 在线视频一区二区三区四区| 久久综合狠狠综合久久激情| 草草草在线视频| 久久精品国产大片免费观看| 亚洲free性xxxx护士hd| 久久久久黄久久免费漫画| 亚洲成年人在线播放| 色网站在线播放| 久久久久国产免费免费| 午夜免费精品视频| 一区二区三区视频免费观看| 国产精品 欧美在线| 欧美性天天影视| 日韩欧美123| 中文字幕激情小说| 国产三级精品视频| 亚洲天堂av一区二区三区| 国模吧视频一区| 美脚丝袜一区二区三区在线观看| 91精品国产66| 久久99热这里只有精品国产| 黄片毛片在线看| 欧美在线免费观看视频| 欧美第一页在线观看| av在线播放成人| 久久久久久久片| 综合久久十次| 乱一区二区三区在线播放| 欧美视频精品| 久久久综合免费视频| 国产高清在线| 日韩欧美不卡在线观看视频| 亚洲自拍一区在线观看| 亚洲精品乱码久久久久久日本蜜臀| 亚洲天堂av网站| 裸体在线国模精品偷拍| 日韩网站在线免费观看| 国产欧美一区二区三区精品观看| 亚洲一区二区久久久久久| 水蜜桃在线视频| 久久亚洲影音av资源网 | 99国产精品久久一区二区三区| 2019日本中文字幕| 在线黄色网页| 影音先锋日韩有码| 五十路在线视频| 欧美二区三区91| 亚洲 欧美 中文字幕| 亚洲综合免费观看高清完整版 | 欧美日韩黄色大片| 国产美女福利视频| 国产偷国产偷亚洲高清人白洁| 国产chinesehd精品露脸| 免播放器亚洲一区| 久久婷婷国产精品| 国内精品久久久久久久影视麻豆 | 久久美女免费视频| www.亚洲免费av| 三级黄色片免费观看| 日韩和欧美一区二区三区| 成人午夜免费在线| 国内精品美女在线观看| 四虎永久免费网站| 清纯唯美日韩| 欧洲在线视频一区| 人人网欧美视频| 国产高清在线精品一区二区三区| 91成人短视频在线观看| 国产精品视频精品| 国精产品一区二区三区有限公司| 97在线视频免费看| 国产一线二线在线观看| 九色成人免费视频| 国产乱色在线观看| 久久精品视频播放| 色影视在线观看| 日韩一区二区在线视频| 高清毛片在线看| 中文字幕精品av| www.成人.com| 在线看日韩av| 日本成人网址| 日韩亚洲欧美成人| 免费在线观看黄色网| 色老头一区二区三区| 日本三级在线视频| 久久黄色av网站| 八戒八戒神马在线电影| 理论片在线不卡免费观看| 国产婷婷视频在线| 欧美成人精品在线观看| 成人看av片| 久久久久在线观看| www.综合| 秋霞av国产精品一区| 激情都市亚洲| 国产精品久久久久久久久免费看| 国产精品天堂蜜av在线播放| 国产欧美精品日韩精品| 祥仔av免费一区二区三区四区| 91在线视频精品| av成人综合| 黑人另类av| 美女网站一区| 亚洲国产激情一区二区三区| 婷婷亚洲五月色综合| 中文字幕在线中文| 亚洲东热激情| 男人女人黄一级| 国产一区在线精品| 性色av蜜臀av浪潮av老女人| 91尤物视频在线观看| 精品国产无码在线观看| 国产精品二区一区二区aⅴ污介绍| 一区二区国产精品精华液| 亚洲国产精品久久一线不卡| 特级做a爱片免费69| 欧美色综合久久| 亚洲爱情岛论坛永久| 日韩av网址在线观看| 成a人v在线播放| 欧美剧在线观看| 在线观看欧美日韩电影| 国产精自产拍久久久久久蜜| 日韩中文字幕一区二区高清99| 麻豆91蜜桃| 一区二区日韩欧美| 男女视频网站在线观看| 捆绑调教一区二区三区| 国产精久久久久| 国产亚洲成aⅴ人片在线观看 | 亚洲综合激情在线| 久久久亚洲精品无码| 久久激五月天综合精品| 秘密基地免费观看完整版中文 | 青青草免费在线视频观看| 国产欧美不卡| 亚洲第一天堂久久| www日韩大片| 欧美人与禽zozzo禽性配| 色激情天天射综合网| a天堂在线观看视频| 亚洲免费成人av电影| 91麻豆免费在线视频| 国产精品久久久久久久久借妻 | 亚洲国产精品一区二区三区| av网站大全在线观看| 91av在线网站| 另类视频一区二区三区| 日韩高清av| 日韩午夜av| 亚洲熟妇一区二区| 国产精品乱码人人做人人爱| 老熟妇仑乱一区二区av| 亚洲成人网av| 菠萝蜜视频国产在线播放| 国产精品av网站| 神马久久影院| 欧美午夜性视频| 国产成人精品免费网站| 激情无码人妻又粗又大| 日韩欧美在线免费| 天天色综合久久| 欧美激情一区二区三区在线视频观看 | 精品国产91乱码一区二区三区四区| 97中文字幕在线| 国产精品影视天天线| 你懂得在线观看| 欧美无乱码久久久免费午夜一区| 三级黄视频在线观看| 韩国v欧美v日本v亚洲| 中文字幕一区二区三区四区久久| 97精品国产97久久久久久粉红| 麻豆极品一区二区三区| 人妻少妇无码精品视频区| 欧美日韩中文字幕综合视频| 四虎永久在线精品免费网址| 欧美激情精品久久久久久黑人| 久久亚洲精精品中文字幕| 中日韩在线视频| 精品一区二区三区免费毛片爱| 五月婷婷六月香| 欧美日韩久久一区二区| 天天影视久久综合| 国产欧亚日韩视频| 999国产精品视频| 日本中文字幕影院| 亚洲人精品午夜| 精品人妻无码一区二区| 欧美乱大交xxxxx另类电影| 日韩一区二区三区高清在线观看| 一级性生活视频| 国产不卡一区视频| 亚洲精品77777| 日韩精品中文字幕在线播放| 欧美人体一区二区三区| 性欧美精品一区二区三区在线播放 | 亚洲欧美一区二区视频| 国产成人精品av在线观| 欧美激情视频免费观看| 牛牛影视一区二区三区免费看| 精品欧美一区免费观看α√| 26uuu成人网一区二区三区| 7799精品视频天天看| 中文字幕av一区中文字幕天堂| 国产欧美在线观看免费| 美女黄色片网站| 成人av免费在线播放| 无码aⅴ精品一区二区三区| 色哟哟亚洲精品一区二区| 亚洲一区二区av| 久久亚洲中文字幕无码| 国产欧美日韩综合| 97国产精品久久久| 欧美黑人狂野猛交老妇| 色综合综合网| 91免费视频污| 精品日韩视频在线观看| 永久免费av在线| 国产精品视频免费观看| 日韩成人一级片| 欧美成人三级在线观看| 亚洲免费一级电影| 国产精品**亚洲精品| 亚欧无线一线二线三线区别| 国产精品婷婷午夜在线观看| 亚洲高清在线观看视频| 日韩av成人在线观看| 亚洲一区二区日韩| 波多野结衣办公室33分钟| 69精品人人人人| 色在线视频观看| 无码人妻aⅴ一区二区三区日本| 北岛玲一区二区三区四区| 这里只有精品国产| 久久久久久久电影一区| 久久中文字幕av一区二区不卡| 精品人妻一区二区免费| 欧美三级中文字幕在线观看| 69av成人| 国产一二三四五| 中文字幕+乱码+中文字幕一区|