iOS代碼規(guī)范

一些原則

參照 https://github.com/FantasticLBP/codesnippets
  1. 長(zhǎng)的愉镰,描述性的方法和變量命名是好的丈探。不要使用簡(jiǎn)寫碗降,除非是一些大家都知道的場(chǎng)景比如 VIP讼渊。不要使用 bgView爪幻,推薦使用 backgroundView
  2. 見名知意笔咽。含義清楚叶组,做好不加注釋代碼自我表述能力強(qiáng)。(前提是代碼足夠規(guī)范)
  3. 不要過分追求技巧侣监,降低代碼可讀性
  4. 刪除沒必要的代碼橄霉。比如我們新建一個(gè)控制器姓蜂,里面會(huì)有一些不會(huì)用到的代碼钱慢,或者注釋起來的代碼懒棉,如果這些代碼不需要策严,那就刪除它享钞,留著偷懶嗎栗竖?下次需要自己手寫
  5. 在方法內(nèi)部不要重復(fù)計(jì)算某個(gè)值狐肢,適當(dāng)?shù)那闆r下可以將計(jì)算結(jié)果緩存起來
  6. 盡量減少單例的使用。
  7. 提供一個(gè)統(tǒng)一的數(shù)據(jù)管理入口僵腺,不管是 MVC、MVVM贵试、MVP 模塊內(nèi)提供一個(gè)統(tǒng)一的數(shù)據(jù)管理入口會(huì)使得代碼變得更容易管理和維護(hù)豌蟋。
  8. 除了 .m 文件中方法梧疲,其他的地方"{"不需要另起一行缭受。
- (void)getGooodsList
{
    // ...
}

- (void)doHomework
{
    if (self.hungry) {
        return;
    }
    if (self.thirsty) {
        return;
    }
    if (self.tired) {
        return;
    }
    papapa.then.over;
}

變量

  1. 一個(gè)變量最好只有一個(gè)作用浩销,切勿為了節(jié)省代碼行數(shù),覺得一個(gè)變量可以做多個(gè)用途陆盘。(單一原則)
  2. 方法內(nèi)部如果有局部變量太防,那么局部變量應(yīng)該靠近在使用的地方蜒车,而不是全部在頂部聲明全部的局部變量。

運(yùn)算符

  1. 1元運(yùn)算符和變量之間不需要空格嬉挡。例如:++n
  2. 2元運(yùn)算符與變量之間需要空格隔開庞钢。例如: containerWidth = 0.3 * Screen_Width
  3. 當(dāng)有多個(gè)運(yùn)算符的時(shí)候需要使用括號(hào)來明確正確的順序,可讀性較好阱穗。例如: 2 << (1 + 2 * 3 - 4)

條件表達(dá)式

  1. 當(dāng)有條件過多、過長(zhǎng)的時(shí)候需要換行鲁僚,為了代碼看起來整齊些
//good
if (condition1() && 
    condition2() && 
    condition3() && 
    condition4()) {
  // Do something
}
//bad
if (condition1() && condition2() && condition3() && condition4()) { // Do something }
  1. 在一個(gè)代碼塊里面有個(gè)可能的情況時(shí)善于使用 return 來結(jié)束異常的情況侨艾。
- (void)doHomework
{
    if (self.hungry) {
        return;
    }
    if (self.thirsty) {
        return;
    }
    if (self.tired) {
        return;
    }
    papapa.then.over;
}
  1. 每個(gè)分支的實(shí)現(xiàn)都必須使用 {} 包含。
// bad
if (self.hungry) self.eat() 
// good
if (self.hungry) {
    self.eat()
}
  1. 條件判斷的時(shí)候應(yīng)該是變量在左当叭,條件在右蚁鳖。 if ( currentCursor == 2 ) { //... }
  2. switch 語句后面的每個(gè)分支都需要用大括號(hào)括起來赁炎。
  3. switch 語句后面的 default 分支必須存在醉箕,除非是在對(duì)枚舉進(jìn)行 switch。
switch (menuType) {  
  case menuTypeLeft: {
    // ...  
    break; 
   }
  case menuTypeRight: {
    // ...  
    break; 
  }
  case menuTypeTop: {
    // ...  
    break; 
  }
  case menuTypeBottom: {
    // ...  
    break; 
  }
}

類名

  1. 大寫駝峰式命名徙垫。每個(gè)單詞首字母大寫讥裤。比如「申請(qǐng)記錄控制器」ApplyRecordsViewController
  2. 每個(gè)類型的命名以該類型結(jié)尾。
    • ViewController:使用 ViewController 結(jié)尾姻报。例子:ApplyRecordsViewController
    • View:使用 View 結(jié)尾坞琴。例子:分界線:BoundaryView
    • Model:使用Model結(jié)尾。例子:圖書:BookModel
    • NSArray:使用 s /array結(jié)尾剧辐。比如商品分類數(shù)據(jù)源忍啤。categories/categoryArr未檩;
    • UITableViewCell:使用 Cell 結(jié)尾悲雳。比如 MyProfileCell
    • Protocol:使用 Delegate 或者 Datasource 結(jié)尾顿苇。比如 XQScanViewDelegate钙皮;
    • Tool:工具類
    • 代理類:Delegate
    • Service 類:Service
  3. 類前綴可以按照項(xiàng)目拼音縮寫。例如:韋林:WLHomeViewController,WLHomeView。也可以使用通用的前綴步悠,例如:網(wǎng)校:WXHomeModel谚咬;

類的注釋

有時(shí)候我們需要為我們創(chuàng)建的類設(shè)置一些注釋。我們可以在類的下面添加。

枚舉

枚舉的命名和類的命名相近。

typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) {
    UIControlContentVerticalAlignmentCenter  = 0,
    UIControlContentVerticalAlignmentTop     = 1,
    UIControlContentVerticalAlignmentBottom  = 2,
    UIControlContentVerticalAlignmentFill    = 3,
};

  1. 全部大寫撵幽,單詞與單詞之間用 _ 連接链烈。
  2. K 開頭。后面遵循大寫駝峰命名誉己「だ「不帶參數(shù)」
#define HOME_PAGE_DID_SCROLL @"com.xq.home.page.tableview.did.scroll"
#define KHomePageDidScroll @"com.xq.home.page.tableview.did.scroll"

屬性

書寫規(guī)則贱田,基本上就是 @property 之后空一格乔询,括號(hào)勉吻,里面的 線程修飾詞僵控、內(nèi)存修飾詞、讀寫修飾詞,空一格 類 對(duì)象名稱
根據(jù)不同的場(chǎng)景選擇合適的修飾符。

@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, assign, readonly) BOOL loading;   
@property (nonatomic, weak) id<#delegate#> delegate;
@property (nonatomic, copy) <#returnType#> (^<#Block#>)(<#parType#>);

單例

單例適合全局管理狀態(tài)或者事件的場(chǎng)景。一旦創(chuàng)建垦巴,對(duì)象的指針保存在靜態(tài)區(qū)芬膝,單例對(duì)象在堆內(nèi)存中分配的內(nèi)存空間只有程序銷毀的時(shí)候才會(huì)釋放∠姥保基于這種特點(diǎn)匾委,那么我們類似 UIApplication 對(duì)象斩松,需要全局訪問唯一一個(gè)對(duì)象的情況才適合單例,或者訪問頻次較高的情況狡汉。我們的功能模塊的生命周期肯定小于 App 的生命周期盆顾,如果多個(gè)單例對(duì)象的話揖铜,勢(shì)必 App 的開銷會(huì)很大滔金,糟糕的情況系統(tǒng)會(huì)殺死 App。如果覺得非要用單例比較好氮唯,那么注意需要在合適的場(chǎng)合 tearDown 掉。

單例的使用場(chǎng)景概括如下:

  • 控制資源的使用,通過線程同步來控制資源的并發(fā)訪問。
  • 控制實(shí)例的產(chǎn)生帆卓,以達(dá)到節(jié)約資源的目的。
  • 控制數(shù)據(jù)的共享靶累,在不建立直接關(guān)聯(lián)的條件下扎狱,讓多個(gè)不相關(guān)的進(jìn)程或線程之間實(shí)現(xiàn)通信绳军。
+ (instancetype)sharedInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //because has rewrited allocWithZone  use NULL avoid endless loop lol.
        _sharedInstance = [[super allocWithZone:NULL] init];
    });
    
    return _sharedInstance;
}

+ (id)allocWithZone:(struct _NSZone *)zone
{
    return [TestNSObject sharedInstance];
}

+ (instancetype)alloc
{
    return [TestNSObject sharedInstance];
}

- (id)copy
{
    return self;
}

- (id)mutableCopy
{
    return self;
}

- (id)copyWithZone:(struct _NSZone *)zone
{
    return self;
}

私有變量

推薦以 _ 開頭漫贞,寫在 .m 文件中甸箱。例如 NSString * _somePrivateVariable

代理方法

  1. 類的實(shí)例必須作為方法的參數(shù)之一。
  2. 對(duì)于一些連續(xù)的狀態(tài)的迅脐,可以加一些 will(將要)芍殖、did(已經(jīng))
  3. 以類的名稱開頭
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;

方法

  1. 方法與方法之間間隔一行
  2. 大量的方法盡量要以組的形式放在一起,比如生命周期函數(shù)谴蔑、公有方法豌骏、私有方法、setter && getter隐锭、代理方法..
  3. 方法最后面的括號(hào)需要另起一行窃躲。遵循 Apple 的規(guī)范
  4. 對(duì)于其他場(chǎng)景的括號(hào),括號(hào)不需要單獨(dú)換行钦睡。比如 if 后面的括號(hào)蒂窒。
  5. 如果方法參數(shù)過多過長(zhǎng),建議多行書寫。用冒號(hào)進(jìn)行對(duì)齊洒琢。
  6. 一個(gè)方法內(nèi)的代碼最好保持在50行以內(nèi)秧秉,一般經(jīng)驗(yàn)來看如果一個(gè)方法里面的代碼行數(shù)過多,代碼的閱讀體驗(yàn)就很差(別問為什么衰抑,做過重構(gòu)代碼行數(shù)很長(zhǎng)的人都有類似的心情)
  7. 一個(gè)函數(shù)只做一個(gè)事情象迎,做到單一原則。所有的類呛踊、方法設(shè)計(jì)好后就可以類似搭積木一樣實(shí)現(xiàn)一個(gè)系統(tǒng)。
  8. 對(duì)于有返回值的函數(shù)拇舀,且函數(shù)內(nèi)有分支情況蜻底。確保每個(gè)分支都有返回值骄崩。
  9. 函數(shù)如果有多個(gè)參數(shù),外部傳入的參數(shù)需要檢驗(yàn)參數(shù)的非空要拂、數(shù)據(jù)類型的合法性站楚,參數(shù)錯(cuò)誤做一些措施:立即返回脱惰、斷言。
  10. 多個(gè)函數(shù)如果有邏輯重復(fù)的代碼窿春,建議將重復(fù)的部分抽取出來,成為獨(dú)立的函數(shù)進(jìn)行調(diào)用
- (instancetype)init
{
    self = [super init];
    if (self) {
        <#statements#>
    }
    return self;
}

- (void)doHomework:(NSString *)name
            period:(NSInteger)second
            score:(NSInteger)score;
  1. 方法如果有多個(gè)參數(shù)的情況下需要注意是否需要介詞和連詞旧乞。很多時(shí)候在不知道如何抉擇測(cè)時(shí)候思考下蘋果的一些 API 的方法命名尺栖。
//good
- (instancetype)initWithAge:(NSInteger)age name:(NSString *)name;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;


//bad
- (instancetype)initWithAge:(NSInteger)age andName:(NSString *)name;

- (void)tableView:(UITableView *)tableView :(NSIndexPath *)indexPath;
  1. .m 文件中的私有方法需要在頂部進(jìn)行聲明
  2. 方法組之間也有個(gè)順序問題。
  • 在文件最頂部實(shí)現(xiàn)屬性的聲明延赌、私有方法的聲明(很多人省去這一步,問題不大者蠕,但是蠻多第三方的庫都寫了屡贺,看起來還是會(huì)很方便锌杀,建議書寫)。
  • 在生命周期的方法里面量没,比如 viewDidLoad 里面只做界面的添加,而不是做界面的初始化究抓,所有的 view 初始化建議放在 getter 里面去做袭灯。往往 view 的初始化的代碼長(zhǎng)度會(huì)比較長(zhǎng)、且一般會(huì)有多個(gè) view 所以 getter 和 setter 一般建議放在最下面橘茉,這樣子頂部就可以很清楚的看到代碼的主要邏輯姨丈。
  • 所有button、gestureRecognizer 的響應(yīng)事件都放在這個(gè)區(qū)域里面蟋恬,不要到處亂放歼争。

文件基本上就是

//___FILEHEADER___

#import "___FILEBASENAME___.h"
/*ViewController*/

/*View&&Util*/

/*model*/

/*NetWork InterFace*/

/*Vender*/

@interface ___FILEBASENAMEASIDENTIFIER___ ()

@end

@implementation ___FILEBASENAMEASIDENTIFIER___


#pragma mark - life cycle
- (void)viewWillAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = <#value#>;
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
}

#ifdef DEBUG
- (void)dealloc
{
    NSLog(@"%s",__func__);
}
#endif

#pragma mark - public Method

#pragma mark - private method

#pragma mark - event response



#pragma mark - UITableViewDelegate

#pragma mark - UITableViewDataSource
//...(多個(gè)代理方法依次往下寫)

#pragma mark - getters and setters

@end

圖片資源

  1. 單個(gè)文件的命名
    文件資源的命名也需要一定的規(guī)范,形式為:功能模塊名類別功能_狀態(tài)@nx.png
    Setting_Button_search_selected@2x.png俩莽、Setting_Button_search_selected@3x.png
    Setting_Button_search_unselected@2x.png洒沦、Setting_Button_search_unselected@3x.png
  2. 資源的文件夾命名
    最好也參考 App 按照功能模塊建立對(duì)應(yīng)的實(shí)體文件夾目錄,最后到對(duì)應(yīng)的目錄下添加相應(yīng)的資源文件瞒津。
    注:一定要?jiǎng)h除不需要使用的圖標(biāo)

注釋

  1. 對(duì)于類的注釋寫在當(dāng)前類文件的頂部
  2. 對(duì)于屬性的注釋需要寫在屬性后面的地方括尸。 //*<userId/
  3. 對(duì)于 .h 文件中方法的注釋,一律按快捷鍵 command+option+/屁柏。三個(gè)快捷鍵解決。按需在旁邊對(duì)方法進(jìn)行說明解釋僧家、返回值裸删、參數(shù)的說明和解釋
  4. 對(duì)于 .m 文件中的方法的注釋,在方法的旁邊添加 //肌稻。
  5. 注釋符和注釋內(nèi)容需要間隔一個(gè)空格匕荸。 例如: // fetch goods list

版本規(guī)范

采用 A.B.C 三位數(shù)字命名,比如:1.0.2诺凡,當(dāng)有更新的情況下按照下面的依據(jù)

版本號(hào) 右說明對(duì)齊標(biāo)題 示例
A.b.c 屬于重大內(nèi)容的更新 1.0.2 -> 2.0.0
a.B.c 屬于小部分內(nèi)容的更新 1.0.2 -> 1.1.1
a.b.C 屬于補(bǔ)丁更新 1.0.2 -> 1.0.3

改進(jìn)

我們知道了平時(shí)在使用 Xcode 開發(fā)的過程中使用的系統(tǒng)提供的代碼塊所在的地址和新建控制器药薯、模型、view等的文件模版的存放文件夾地址后真屯,我們就可以設(shè)想下我們是否可以定制自己團(tuán)隊(duì)風(fēng)格的控制器模版穷娱、是否可以打造和維護(hù)自己團(tuán)隊(duì)的高頻使用的代碼塊?

答案是可以的配深。

Xcode 代碼塊的存放地址:~/Library/Developer/Xcode/UserData/CodeSnippets
Xcode 文件模版的存放地址:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/

意義

  1. 為了個(gè)人或者團(tuán)隊(duì)開發(fā)者的代碼更加規(guī)范嫁盲。Property的書寫的時(shí)候的空格羞秤、線程修飾詞、內(nèi)存修飾詞的先后順序
  2. 提供大量可用的代碼塊瘾蛋,提高開發(fā)效率哺哼。比如在 Xcode 里面敲 UITableView_init 便可以自動(dòng)懶加載創(chuàng)建一個(gè) UITabelView 對(duì)象叼风,你只需要設(shè)置在指定的位置寫相應(yīng)的參數(shù)
  3. 通過一些代碼塊提高代碼規(guī)范棍苹、避免一些bug。比如曾看到過 block 屬性用 strong 修飾的代碼懈贺,造成內(nèi)存泄漏坡垫。舉個(gè)例子你在 Xcode 中輸入 Property_delegate 就會(huì)出來 @property (nonatomic, weak) id<<#delegate#>> delegate;画侣,你輸入 Property_block 就會(huì)出來 @property (nonatomic, copy) <#returnType#> (^<#Block#>)(<#parType#>);

代碼塊的改造

我們可以將屬性、控制器生命周期方法溉卓、單例構(gòu)造一個(gè)對(duì)象的方法搬泥、代理方法、block尉尾、GCD燥透、UITableView 懶加載、UITableViewCell 注冊(cè)肢藐、UITableView 代理方法的實(shí)現(xiàn)吱韭、UICollectionVIew 懶加載理盆、UICollectionVIewCell 注冊(cè)、UICollectionView 的代理方法實(shí)現(xiàn)等等組織為 codesnippets

思考

  • 封裝好 codesnippets 之后團(tuán)隊(duì)除了你編寫這個(gè)項(xiàng)目的人如何使用熏挎?如何知道是否有這個(gè)代碼塊坎拐?

    方案:先在團(tuán)隊(duì)內(nèi)召開代碼規(guī)范會(huì)議养匈,大家都統(tǒng)一知道這個(gè)事情在都伪。之后大家共同維護(hù) codesnippets。用法見下

屬性:通過 Property_類型 開頭猬仁,回車鍵自動(dòng)補(bǔ)全先誉。比如 Strong 類型,編寫代碼通過 Property_Strong 回車鍵自動(dòng)補(bǔ)全成如下格式

@property (nonatomic, strong) <#Class#> *<#object#>;

方法:以 Method_關(guān)鍵詞 回車鍵確認(rèn)诈闺,自動(dòng)補(bǔ)全铃芦。比如 Method_UIScrollViewDelegate 回車鍵自動(dòng)補(bǔ)全成 如下格式

#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    
}

各種常見的 Mark:以 Mark_關(guān)鍵詞 回車確認(rèn)刃滓,自動(dòng)補(bǔ)全。比如 Method_MethodsGroup 回車鍵自動(dòng)補(bǔ)全成 如下格式

#pragma mark - life cycle
#pragma mark - public Method
#pragma mark - private method
#pragma mark - event response
#pragma mark - UITableViewDelegate
#pragma mark - UITableViewDataSource
#pragma mark - getters and setters
  • 封裝好 codesnippets 之后團(tuán)隊(duì)內(nèi)如何統(tǒng)一卓缰?想到一個(gè)方案老客,可以將團(tuán)隊(duì)內(nèi)的 codesnippets 共享到 git胧砰,團(tuán)隊(duì)內(nèi)的其他成員再從云端拉取同步。這樣的話團(tuán)隊(duì)內(nèi)的每個(gè)成員都可以使用最新的 codesnippets 來編碼偿乖。

    編寫 shell 腳本哲嘲。幾個(gè)關(guān)鍵步驟:

    1. 給系統(tǒng)文件夾授權(quán)
    2. 在腳本所在文件夾新建存放代碼塊的文件夾
    3. 將系統(tǒng)文件夾下面的代碼塊復(fù)制到步驟2創(chuàng)建的文件夾下面
    4. 將當(dāng)前的所有文件提交到 Git 倉庫

文件模版的改造

我們觀察系統(tǒng)文件模版的特點(diǎn),和在 Xcode 新建文件模版對(duì)應(yīng)画切。

Xcode file template存放地址

所以我們新建 Custom 文件夾霍弹,將系統(tǒng) Source 文件夾下面的 Cocoa Touch Class.xctemplate 復(fù)制到 Custom 文件夾下。重命名為我們需要的名字岛宦,我這里以“Power”為例

自定義文件模版示例

進(jìn)入 PowerViewController.xctemplate/PowerViewControllerObjective-C

修改 ___FILEBASENAME___.h___FILEBASENAME___.m 文件內(nèi)容

注意點(diǎn)1

在替換 .h 文件內(nèi)容的時(shí)候后面改為 UIViewController砾肺,不然其他開發(fā)者新建文件模版的時(shí)候出現(xiàn)的不是 UIViewController 而是我們的 PowerViewController

.m文件內(nèi)容

修改 TemplateInfo.plist

plist注意點(diǎn)

思考:

  • 如何使用

    商量好一個(gè)標(biāo)識(shí)(“Power”)变汪。比如我新建了單例本鸣、控制器、Model、UIView童芹、UITableViewCell假褪、UICollectionViewCell6個(gè)模版,都以為 Power 開頭宁否。

    模版用法
  • 如何共享

    以 shell 腳本為工具缀遍。使用腳本將 git 云端的代碼模版同步到本地 Xcode 文件夾對(duì)應(yīng)的位置就可以使用了域醇。關(guān)鍵步驟:

    1. git clone 代碼到腳本所在文件夾
    2. 進(jìn)入存放 codesnippets 的文件夾將內(nèi)容復(fù)制到系統(tǒng)存放 codesnippets 的地方
    3. 進(jìn)入存放 file template 的文件夾將內(nèi)容復(fù)制到系統(tǒng)存放 file template 的地方

內(nèi)容及其如何使用

  1. Property 屬性。敲 Property_ 自動(dòng)聯(lián)想锅铅,光標(biāo)移動(dòng)選中后敲回車自動(dòng)補(bǔ)全
  2. Mark 標(biāo)識(shí)减宣。 敲 Mark_ 自動(dòng)聯(lián)想,會(huì)展示各種常用的 Mark贼邓,光標(biāo)移動(dòng)選中后敲回車自動(dòng)補(bǔ)全
  3. Method 方法。敲 Method_ 自動(dòng)聯(lián)想眼溶,會(huì)展示各種常用的 Method晓勇,光標(biāo)移動(dòng)選中后敲回車自動(dòng)補(bǔ)全
  4. GCD。敲 GCD_ 自動(dòng)聯(lián)想绰筛,會(huì)展示各種常用的 GCD,光標(biāo)移動(dòng)選中后敲回車自動(dòng)補(bǔ)全
  5. 常用 UI 控件的懶加載显拳。敲 _init 自動(dòng)聯(lián)想,展示常用的 UI 控件的懶加載年叮,光標(biāo)移動(dòng)選中后敲回車自動(dòng)補(bǔ)全
  6. Delegate只损。敲 Delegate_ 自動(dòng)聯(lián)想,會(huì)展示各種常用的 Delegate叮叹,光標(biāo)移動(dòng)選中后敲回車自動(dòng)補(bǔ)全
  7. Notification爆存。敲 NSNotification_ 自動(dòng)聯(lián)想,會(huì)展示各種常用的 NSNotification 的代碼塊蜂林,比如發(fā)送通知拇泣、添加觀察者、移除觀察者睁蕾、觀察者方法的實(shí)現(xiàn)等等,光標(biāo)移動(dòng)選中后敲回車自動(dòng)補(bǔ)全
  8. Protocol瀑凝。敲 Protocol_ 自動(dòng)聯(lián)想臭杰,會(huì)展示各種常用的 Protocol 的代碼塊渴杆,光標(biāo)移動(dòng)選中后敲回車自動(dòng)補(bǔ)全
  9. 內(nèi)存修飾代碼塊
  10. 工程常用 TODO、FIXME囊拜、Mark比搭。敲 Mark_ 自動(dòng)聯(lián)想,會(huì)展示各種常用的 Mark 的代碼塊蜜托,光標(biāo)移動(dòng)選中后敲回車自動(dòng)補(bǔ)全
  11. 內(nèi)存修飾代碼塊戚长。敲 Memory_ 自動(dòng)聯(lián)想,會(huì)展示各種常用的內(nèi)存修飾的代碼塊,光標(biāo)移動(dòng)選中后敲回車自動(dòng)補(bǔ)全
  12. 一些常用的代碼塊迫肖。敲 Thread_ 等自動(dòng)聯(lián)想攒驰,選中后敲回車自動(dòng)補(bǔ)全。

使用

chmod +x ./syncSnippets.sh // 為腳本設(shè)置可執(zhí)行權(quán)限
chmod +x ./uploadMySnippets.sh // 為腳本設(shè)置可執(zhí)行權(quán)限
./syncSnippets.sh // 同步git云端代碼塊和文件模版到本地
./uploadMySnippets.sh //將本地的代碼塊和文件模版同步到云端
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末隅津,一起剝皮案震驚了整個(gè)濱河市伦仍,隨后出現(xiàn)的幾起案子很洋,更是在濱河造成了極大的恐慌,老刑警劉巖谓苟,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涝焙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赤兴,警方通過查閱死者的電腦和手機(jī)派草,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門近迁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鉴竭,你說我怎么就攤上這事搏存。” “怎么了缩焦?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵袁滥,是天一觀的道長(zhǎng)灾螃。 經(jīng)常有香客問我,道長(zhǎng)嵌赠,這世上最難降的妖魔是什么熄赡? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任本谜,我火速辦了婚禮,結(jié)果婚禮上溜在,老公的妹妹穿的比我還像新娘。我一直安慰自己仆葡,他們只是感情好志笼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布纫溃。 她就那樣靜靜地躺著,像睡著了一般紊浩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坊谁,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天口芍,我揣著相機(jī)與錄音,去河邊找鬼颠猴。 笑死小染,一個(gè)胖子當(dāng)著我的面吹牛氧映,可吹牛的內(nèi)容都是我干的脱货。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼臼疫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼烫堤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸽斟,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剩燥,沒想到半個(gè)月后立倍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體口注,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年娇斑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悠菜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片败富。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兽叮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出账阻,到底是詐尸還是另有隱情泽本,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布蒲牧,位于F島的核電站赌莺,受9級(jí)特大地震影響艘狭,放射性物質(zhì)發(fā)生泄漏翠订。R本人自食惡果不足惜遵倦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一骇吭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棘脐,春花似錦龙致、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霜大。三九已至,卻和暖如春曙强,著一層夾襖步出監(jiān)牢的瞬間途茫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工娜扇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袱衷,地道東北人笑窜。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓登疗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親断傲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子认罩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 前言 代碼規(guī)范可以說是老生常談的話題了, 也是程序員自我修養(yǎng)的一種體現(xiàn)垦垂, 雖然一套好的代碼規(guī)范不能使程序運(yùn)行的更加...
    kakukeme閱讀 1,053評(píng)論 0 51
  • iOS編程規(guī)范0規(guī)范 0.1前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開發(fā)人員編寫出簡(jiǎn)潔劫拗、可維護(hù)、可靠页慷、可 測(cè)試酒繁、高效...
    iOS行者閱讀 4,454評(píng)論 21 35
  • 這里有些關(guān)于編碼風(fēng)格Apple官方文檔,如果有些東西沒有提及揭绑,可以在以下文檔來查找更多細(xì)節(jié): The Object...
    Loki9527閱讀 396評(píng)論 0 0
  • 概要 Objective-C是一門面向?qū)ο蟮膭?dòng)態(tài)編程語言,主要用于編寫iOS和Mac應(yīng)用程序稳析。關(guān)于Objectiv...
    DreamMmMmM閱讀 1,167評(píng)論 0 7
  • 終于開始了夢(mèng)想的大學(xué)生活洗做,確實(shí)很美妙。不想有的束縛都沒了彰居,期盼中的應(yīng)該正在來的路上诚纸,至少我愿意這樣單純地相信。開始...
    看得見風(fēng)閱讀 242評(píng)論 0 1