iOS代碼規(guī)范

iOS代碼規(guī)范

一宪巨、前言

本規(guī)范基于Google Objective-C Style Guide和百度Objective-C規(guī)范和實(shí)際開發(fā)情況,對(duì)其中的說明性語句及非ARC部分進(jìn)行了刪減劫流。
每項(xiàng)規(guī)范前面的[強(qiáng)制]代表該規(guī)范需要強(qiáng)制執(zhí)行,[建議]代表推薦執(zhí)行但不強(qiáng)制。

本文章里面的代碼格式大部分內(nèi)容可以通過插件自動(dòng)格式化祠汇,詳見ClangFormat-Xcode插件使用仍秤。

二、縮進(jìn)與格式

1座哩、縮進(jìn)符

  • [強(qiáng)制] 只用空格徒扶,用4個(gè)空格表示一個(gè)縮進(jìn)。

2根穷、每行的長度

  • [強(qiáng)制] 應(yīng)盡量控制每行代碼的長度在120個(gè)字符以內(nèi)姜骡。

3、逗號(hào)分隔項(xiàng)

  • [強(qiáng)制] 用逗號(hào)分隔多項(xiàng)時(shí)屿良,每個(gè)逗號(hào)后使用1個(gè)空格進(jìn)行分隔圈澈。

4、左大括號(hào)位置

  • [強(qiáng)制] 左大括號(hào) { 不單獨(dú)占據(jù)一行尘惧,放置在上一行的末尾康栈,可以在 { 前增加一個(gè)空格。

5喷橙、聲明與定義

  • [強(qiáng)制] -啥么,+ 與返回類型之間必須有一個(gè)空格,在參數(shù)列表中贰逾,除了參數(shù)之間不要有任何間距悬荣。

示例

- (void)doSomethingWithString:(NSString *)theString { 
    ...
} 
  • [強(qiáng)制] * 號(hào)前面必須要加空格,增加可讀性疙剑。

  • [建議] 如果有參數(shù)太多無法放在同一行內(nèi)氯迂, 最好每個(gè)參數(shù)各自一行。如果采用多行言缤,每個(gè)參數(shù)建議按照 : 進(jìn)行對(duì)齊嚼蚀。

示例

- (void)doSomethingWith:(GTMFoo *)theFoo 
                   rect:(NSRect)theRect                
               interval:(float)theInterval { 
    ...
} 
  • [建議] 當(dāng)?shù)谝粋€(gè)關(guān)鍵詞比其他的短時(shí),可以縮進(jìn)之后的行至少4個(gè)空格管挟,同樣按 : 進(jìn)行對(duì)齊轿曙。

示例

- (void)short:(GTMFoo *)theFoo 
      longKeyword:(NSRect)theRect     
evenLongerKeyword:(float)theInterval                 
            error:(NSError **)theError { 
     ...
} 

6、方法調(diào)用

  • [建議] 方法調(diào)用的格式須要與定義時(shí)的格式一致僻孝。當(dāng)有多種格式化的樣式可供選擇的時(shí)候拳芙,按照慣例,采用在給定的源文件中使用過的那個(gè)方式皮璧。
  • [建議] 所有的參數(shù)都應(yīng)該在同一行。

示例

[myObject doFooWith:arg1 name:arg2 error:arg3]; 

或者每個(gè)參數(shù)一行分飞,并按 : 對(duì)齊悴务。

[myObject doFooWith:arg1               
           name:arg2              
          error:arg3]; 

不建議采用以下風(fēng)格:

 [myObject doFooWith:arg1 name:arg2 //這行寫了兩個(gè)參數(shù)
               error:arg3];  
[myObject doFooWith:arg1                
                 name:arg2 error:arg3]; 

就像聲明和定義一樣,當(dāng)?shù)谝粋€(gè)關(guān)鍵詞比其他的短時(shí),可以縮進(jìn)之后的行至少4個(gè)空格讯檐,同樣按 : 進(jìn)行對(duì)齊:

[myObj short:arg1          
    longKeyword:arg2    
  evenLongerKeyword:arg3                
          error:arg4]; 

7羡疗、@public、@protected與@private

  • [強(qiáng)制] 訪問修飾符 @public别洪, @private叨恨,@protected必須縮進(jìn)2個(gè)空格。

8挖垛、異常

  • [建議] 在單獨(dú)一行時(shí)痒钝,使用 @ 標(biāo)簽格式化 exceptions, @ 標(biāo)簽和左大括號(hào) { 間加一個(gè)空格痢毒,在 @catch 和 對(duì)象捕獲聲明之間也一樣送矩。建議遵循下面的格式:
@try {     
    foo(); 
} @catch (NSException *ex) {     
    bar(ex); 
} @finally {     
    baz(); 
}

9、協(xié)議

  • [強(qiáng)制] 在類型標(biāo)識(shí)符和封裝在尖括號(hào)中的 Protocols 名稱之間要有空格哪替。
@interface MyProtocoledClass : NSObject <NSWindowDelegate> {    
    @private      id <MyFancyDelegate> delegate_; 
} 
(void)setDelegate:(id <MyFancyDelegate>)aDelegate; 
@end 

解釋:這些適用于類的聲明栋荸、實(shí)例變量和方法的聲明。

10凭舶、Blocks

  • [強(qiáng)制] 塊內(nèi)的代碼應(yīng)縮進(jìn)4個(gè)空格晌块。
  • [建議] 因?yàn)榫唧wblock長度的不同,可以有以下幾種風(fēng)格:
    (1)如果block一行就能放下帅霜,就不需要換行匆背。
    (2)如果必須要換行,那么 } 需要和block所在行的第一個(gè)字符對(duì)齊义屏。
    (3)block中的代碼塊應(yīng)該縮進(jìn)4個(gè)空格靠汁。
    (4)如果block很大,比如超過20行闽铐,建議單獨(dú)拿出來賦給一個(gè)本地變量
    (5)如果block沒有參數(shù)蝶怔,那字符 ^{ 之間就不應(yīng)有空格。如果有參數(shù)兄墅,字符 ^{ 之間同樣沒有空格踢星,但是字符 ) { 之間需要有一個(gè)空格。
    (6)包含內(nèi)聯(lián)block的函數(shù)調(diào)用可以在縮進(jìn)4個(gè)空格的基礎(chǔ)上左對(duì)齊隙咸,尤其是調(diào)用中包含多個(gè)內(nèi)聯(lián)block沐悦。

示例


//整個(gè)block放在一行的 
[operation setCompletionBlock:^{ [self onOperationDone]; }];

//多行時(shí)縮進(jìn)四個(gè)空格,{要和block所在行的第一個(gè)字符對(duì)齊
[operation setCompletionBlock:^{

    [self.delegate newDataAvailable];
}]; 

//在C函數(shù)中使用block時(shí)遵循和Objective-C同樣的對(duì)齊和縮進(jìn)原則
dispatch_async(fileIOQueue_, ^{

    NSString *path = [self sessionFilePath];     
    if (path) {       // ...     
    } 
});

// 方法參數(shù)與block聲明能放到一行時(shí)五督。注意比較^(SessionWindow *window) {和上面的^{藏否。 
[[SessionService sharedService]  loadWindowWithCompletionBlock:^(SessionWindow *window) {
         
    if (window) {          
    [self windowDidLoad:window];        
    } else {           
        [self errorLoadingWindow];        
    }     
}]; 

//方法參數(shù)與block聲明不能放到一行時(shí)。 
[[SessionService sharedService]     
    loadWindowWithCompletionBlock:^(SessionWindow *window) {  
           
        if (window) {              
        [self windowDidLoad:window];             
        } else {               
        [self errorLoadingWindow];             
        }         
    }];  

// 較長的Block可聲明為變量充包。 
void (^largeBlock)(void) = ^{
     // ... 
}; 
[operationQueue_ addOperationWithBlock:largeBlock]; 

 // 一次調(diào)用中包含多個(gè)內(nèi)聯(lián)block副签。 
[myObject doSomethingWith:arg1
    firstBlock:^(Foo *a) { // ...
    }
    secondBlock:^(Bar *b){
            // ...
    }];

11遥椿、Container Literals

  • [強(qiáng)制] 使用容器(數(shù)組和字典)常量,如果其內(nèi)容被分為多行淆储,應(yīng)該縮進(jìn)4個(gè)空格冠场。
  • [建議] 如果內(nèi)容單行就能放下,在左大括號(hào)之后和右大括號(hào)之前各添加一個(gè)空格本砰。
NSArray *array = @[ [foo description], @"Another String", [bar description] ];
NSDictionary *dict = @{ 
    NSForegroundColorAttributeName : [NSColor redColor] 
};
  • [建議] 如果內(nèi)容跨越多行碴裙,將左括號(hào)和聲明放在同一行,之后換行的內(nèi)容縮進(jìn)4個(gè)空格点额,并將右括號(hào)單獨(dú)放在新的一行里和聲明行對(duì)齊舔株。
NSArray *array = @[     
    @"This",     
    @"is",    
    @"an",     
    @"array" 
]; 
NSDictionary *dictionary = @{
    NSFontAttributeName : [NSFont fontWithName:@"Helvetica-Bold" size:12],
    NSForegroundColorAttributeName : fontColor
};

三、命名與規(guī)范

在撰寫純粹的Objective-C代碼時(shí)咖楣,推薦使用駝峰命名法督笆。

1、文件名

文件名應(yīng)該反映其中包含的類實(shí)現(xiàn)的名稱诱贿,按照項(xiàng)目中的約定且大小寫相關(guān)娃肿。

  • [強(qiáng)制] 實(shí)現(xiàn)Category的文件名需包含類名,如 NSString+Utils.h 或 NSTextView+Autocomplete.h珠十。

2料扰、Objective-C++

在一個(gè)源碼文件中, Objective-C++ 遵循你實(shí)現(xiàn)的函數(shù)/方法的風(fēng)格焙蹭。
為了最小化在混合開發(fā)Cocoa/Objective-C和C++時(shí)由命名風(fēng)格造成的沖突晒杈,遵循正在實(shí)現(xiàn)方法的風(fēng)格。如果正在實(shí)現(xiàn)的方法是在@implementation 塊中, 使用Objective-C的命名規(guī)范孔厉。如果正在實(shí)現(xiàn)的方法是在C++的class中拯钻,則采用C++的命名規(guī)范。

class CrossPlatformAPI {
  public:
    ... int DoSomethingPlatformSpecific(); // 每個(gè)平臺(tái)的實(shí)現(xiàn)都不一樣

  private:
    int an_instance_var_;
};

// 文件 mac_implementation.mm
#include "cross_platform_header.h" //

// 典型的Objective-C class, 使用Objective-C命名規(guī)范撰豺。
@interface MyDelegate :

    NSObject {
  @private
    int _instanceVar;
    CrossPlatformAPI *_backEndObject;
}
- (void)respondToSomething:(id)something;
@end

@implementation MyDelegate

- (void)respondToSomething:(id)something {

    //從Cocoa橋接到C++的后端
    _instanceVar = _backEndObject->DoSomethingPlatformSpecific();
    NSString *tempString = [NSString stringWithFormat:@"%d", _instanceVar];
    NSLog(@"%@", tempString);
}
@end

// C++ class平臺(tái)相關(guān)的實(shí)現(xiàn), 使用C++命名規(guī)范
int CrossPlatformAPI::DoSomethingPlatformSpecific() {

    NSString *temp_string = [NSString stringWithFormat:@"%d", an_instance_var_];
    NSLog(@"%@", temp_string);
    return [temp_string intValue];
}

3粪般、類名

  • [強(qiáng)制] 類名(包括Category、Protocol名和Block名)以大寫字母開始污桦,通過大小寫而不是下劃線分隔亩歹。
  • [建議] 在設(shè)計(jì)可跨越多個(gè)應(yīng)用之間共享的代碼時(shí),推薦使用前綴凡橱,(例如小作,GTMSendMessage)。還有很多外部依賴庫的大型應(yīng)用中設(shè)計(jì)的類最好也使用前綴稼钩。
  • [建議] 若使用前綴顾稀,則前綴縮寫要大于2個(gè)字符。
  • [建議] Protocal和Block名稱如果和類相關(guān)建議加類名前綴坝撑。

示例


@protocol AdvertisingViewDelegate <NSObject>

- (void)didSelectImageAtIndex:(NSInteger)index;

@end

@interface AdvertisingView : UIView

@property (weak, nonatomic) id <AdvertisingViewDelegate> delegate;

@end

4础拨、Category名

  • [強(qiáng)制] 類別(Category)名中需要加入被擴(kuò)展的類名氮块。

比如我們要給NSString類加一個(gè)解析的功能,我們創(chuàng)建一個(gè)category诡宗,命名為GTMStringParsingAdditions,并且放在名為NSString+Parsing.h的文件中击儡。

  • [強(qiáng)制] 類名與左括號(hào)中間需要有一個(gè)空格塔沃。

示例

//擴(kuò)展一個(gè)framework類:
@interface NSString (GTMStringParsingAdditions)
- (NSString *)foobarString;
@end

//使方法和屬性私有化
@interface FoobarViewController ()
@property(nonatomic, retain) NSView *dongleView;
- (void)performLayout;
@end

5、Objective-C 方法名

  • [強(qiáng)制] 方法名應(yīng)該以小寫字母開頭阳谍,混合大小寫蛀柴。每個(gè)命名參數(shù)也應(yīng)該以小寫字母開頭。
  • [建議] 方法名稱應(yīng)該盡可能讀起來像句子矫夯,意味著你應(yīng)該選擇能夠搭配方法名的參數(shù)名鸽疾。(比如:convertPoint:fromRect:或replaceCharactersInRange:withString:)。
  • [建議] getter類型的方法不加get前綴训貌。

示例

- (id)getDelegate;  // 應(yīng)避免的 
- (id)delegate;     // 推薦的
  • [建議] 在所有參數(shù)前面添加關(guān)鍵字制肮。

示例

- (void)sendAction:(SEL)aSelector toObject:(id)anObject forAllCells:(BOOL)flag;  // 推薦的 
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;      // 錯(cuò)誤的 
  • [建議] 確保參數(shù)前面的關(guān)鍵字可以正確描述參數(shù)。

示例

-  (id)viewWithTag:(NSInteger)aTag;  // 推薦的 
- (id)taggedView:(int)aTag;          // 錯(cuò)誤的
  • [強(qiáng)制] 當(dāng)需要基于已有的一個(gè)方法創(chuàng)建新方法時(shí)递沪,請(qǐng)將新的關(guān)鍵字添加到原有方法后面豺鼻。

示例

- (id)initWithFrame:(CGRect)frameRect;  // 原有方法 
- (id)initWithFrame:(NSRect)frameRect
               mode:(int)aMode
          cellClass:(Class)factoryId
       numberOfRows:(int)rowsHigh
    numberOfColumns:(int)colsWide;     // 新方法
  • [建議] 盡量不要使用“and” 描述參數(shù)。

示例

// 推薦的
(int)runModalForDirectory:(NSString *)path file:(NSString *) name types:(NSArray *)fileTypes;   
//錯(cuò)誤的      
(int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes;

6款慨、變量名

  • [強(qiáng)制] 變量名以小寫字母開頭儒飒,混合大小寫以區(qū)分單詞。

6.1檩奠、普通變量名

  • [建議] 不要使用匈牙利命名法桩了,比如不要使用變量的靜態(tài)類型(int 或 pointer)。盡量寫具有描述意義的名稱埠戳。比如不要使用下面的變量全名:
int w;
int nerr;
int nCompConns;
tix = [[NSMutableArray alloc] init];
obj = [someObject object];
p = [network port];

建議使用如下的變量命名:

int numErrors;
int numCompletedConnections;
tickets = [[NSMutableArray alloc] init];
userInfo = [someObject object];
port = [network port];

6.2井誉、類成員變量

  • [建議] 類成員變量的命名是在普通變量的名字前,添加一個(gè)下劃線做前綴乞而,比如_usernameTextField送悔。

6.3、常量

  • [強(qiáng)制] 常量名(宏爪模,本地常變量等)首字母應(yīng)該以小寫的k開頭欠啤,然后使用混合大小寫區(qū)分單詞,枚舉值前面需要以枚舉名為前綴,前面加E屋灌。

示例

const int kNumberOfFiles = 12;
NSString *const kUserKey = @"kUserKey";
enum EDisPlayTinge { 
    EDisplayTingeGreen = 1 E
    DisplayTingeBlue = 2 
};

6.4洁段、靜態(tài)變量

  • [強(qiáng)制]靜態(tài)變量應(yīng)該以s或者以shared開頭使用混合大小寫命名。

示例

static MyClass *sharedInstance = nil;
static MyClass *sMyClassInstance = nil;

7共郭、圖片命名

  • [強(qiáng)制]命名規(guī)則為「模塊+類型+一級(jí)屬性+二級(jí)屬性」祠丝。

示例

「tabbar_btn_red_n.png」  //tabbar 導(dǎo)航欄疾呻,btn 按鈕,n normal 狀態(tài)
  • [強(qiáng)制]圖片應(yīng)該為PNG文件写半,且需要放入images.scassets中岸蜗。
  • [強(qiáng)制]圖片必須包含@2x圖,如果只有@3x圖需要使用插件轉(zhuǎn)換為@2x圖片叠蝇。
  • [建議]images.scassets應(yīng)該安照模塊進(jìn)行分組璃岳,方便查找。

四悔捶、注釋

1铃慷、文件注釋

  • [建議] 創(chuàng)建文件時(shí)會(huì)生成默認(rèn)的注釋。如果看了文件名還不懂該文件是干什么蜕该,可以有選擇的在一個(gè)文件開頭寫一段關(guān)于內(nèi)容的描述犁柜。

2、聲明部分的注釋

  • [建議] 每個(gè)接口堂淡,類別馋缅,協(xié)議的聲明都應(yīng)該有個(gè)伴隨的注釋,來描述它的作用以及它如何融入整體環(huán)境淤齐。注釋遵循apple doc風(fēng)格股囊,以/*開始,/結(jié)束更啄。
  • [強(qiáng)制] 聲明部分的注釋如果以“//”開頭稚疹,且與代碼同一行,在 “//” 前加空格祭务。

示例

/** 
  * <#Description#>
  * @param nibNameOrNil <#nibNameOrNil description#>
  * @param nibBundleOrNil <#nibBundleOrNil description#>
  * @return <#return value description#>
*/
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
@property(copy) NSString *host;   //network host
  • [建議] 公共接口的每個(gè)方法内狗,都應(yīng)該有注釋來解釋它的作用、參數(shù)义锥、返回值以及其它影響柳沙。

3、實(shí)現(xiàn)部分的注釋

  • [強(qiáng)制] 實(shí)現(xiàn)部分的注釋如果以“//”開頭拌倍,且與代碼同一行赂鲤,在 “//“ 前加空格。

五柱恤、Cocoa 和 Objective-C 特性

1数初、重載指定構(gòu)造函數(shù)

  • [強(qiáng)制] 當(dāng)寫子類的時(shí)候,如果需要init方法梗顺,必須重載父類的指定構(gòu)造函數(shù)泡孩。

2、重載 NSObject 的方法

  • [建議] 如果重載了NSObject類的方法寺谤,建議把它們放在@implementation內(nèi)的前邊仑鸥,這也是慣例吮播。 通常適用(但不局限)于 init...,copyWithZone:眼俊,以及dealloc方法意狠。所有init...應(yīng)放在一起,后面跟著其他NSObject的方法疮胖。

3摄职、初始化

  • [建議] 不要在 init 方法中,將成員變量初始化為 0或 nil获列。如果一個(gè)對(duì)象可被復(fù)用,狀態(tài)需要全部重置蛔垢,這時(shí)可引入 reset方法击孩。
  • [強(qiáng)制] 局部變量不會(huì)被編譯器初始化,所有局部變量使用前必須初始化鹏漆。

4巩梢、避免調(diào)用+ new

  • [強(qiáng)制] 不要調(diào)用NSObject的類方法new,也不要在子類中重載它艺玲。使用alloc和init方法創(chuàng)建并初始化對(duì)象括蝠。

5、保持公共 API 簡(jiǎn)單

  • [建議] 保持公共API簡(jiǎn)單饭聚,避免“包含一切式“的API忌警。

示例

#import "GTMFoo.h"
@interface GTMFoo (PrivateDelegateHandling)
- (NSString *)doSomethingWithDelegate;
// Declare private method
@end

@implementation GTMFoo (PrivateDelegateHandling)
- (NSString *)doSomethingWithDelegate {
    // Implement this method
}
@end
  • [強(qiáng)制] 可以使用私有Category保證公共頭文件整潔。

示例

@interface GTMFoo () { 
    ...
} 

6秒梳、#import與#include

-[強(qiáng)制] 使用#import來引用Objective-C/Objective-C++頭文件法绵,使用#include引用C/C++頭文件。

7酪碘、使用根框架

  • [強(qiáng)制] 包含根框架朋譬,而非單獨(dú)的文件。

示例

#import <Foundation/Foundation.h>     // good 
#import <Foundation/NSArray.h>        // avoid

8兴垦、在init和dealloc中避免使用存取方法

  • [建議] 在init和dealloc方法執(zhí)行的過程中徙赢,子類可能會(huì)處在一個(gè)不穩(wěn)定狀態(tài),所以這些方法中應(yīng)避免調(diào)用存取方法探越,應(yīng)在這些方法中直接對(duì)成員變量進(jìn)行賦值或釋放操作狡赐。

示例

- (instancetype)init {
    self = [super init];
    if (self) {
        _bar = [[NSMutableString alloc] init]; // good
    }
    return self;
}

- (void)dealloc {
    [_bar release];
    // good
    [super dealloc];
}

- (instancetype)init {
    self = [super init];
    if (self) {
        self.bar = [NSMutableString string];   // avoid
    }
    return self;
}

- (void)dealloc {
    self.bar = nil;   // avoid
    [super dealloc];
}

9、按照聲明順序銷毀實(shí)例變量

  • [建議] dealloc中對(duì)象被釋放的順序應(yīng)該與他們?cè)贎interface中聲明的順序一致扶关,這有助于代碼檢查阴汇。

10、setter中對(duì)NSString進(jìn)行copy

  • [建議] 接受NSString作為參數(shù)的setter节槐,應(yīng)該copy它所接受的字符串搀庶。

示例

- (void)setFoo:(NSString *)aFoo {

    [_foo autorelease];
    _foo = [aFoo copy];
} 

11拐纱、避免拋出異常

  • [建議] 不要@throw Objective-C 異常,但要注意從第三方的調(diào)用或者系統(tǒng)調(diào)用捕捉異常哥倔。如果確實(shí)使用了異常秸架,請(qǐng)注釋期望什么方法拋出異常。

12咆蒿、BOOL的使用

  • [強(qiáng)制] 不要直接將 BOOL 值與 YES 东抹、NO進(jìn)行比較。
  • [建議] 對(duì) BOOL 使用邏輯運(yùn)算符(&&, || 和 !)是合法的沃测,返回值也可以安全地轉(zhuǎn)換成 BOOL缭黔。

示例

- (BOOL)isBold {
    return [self fontTraits] & NSFontBoldTrait;
}

- (BOOL)isValid {
    return [self stringValue];
}

- (BOOL)isBold {
    return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;
}

- (BOOL)isValid {
    return [self stringValue] != nil;
}

- (BOOL)isEnabled {
    return [self isValid] && [self isBold];
}

同樣,不要直接比較 YES/NO 和 BOOL 變量蒂破。

BOOL great = [foo isGreat]; if (great == YES) {   // ...be great! } 
BOOL great = [foo isGreat]; if (great) {   // ...be great! } 

13馏谨、屬性

  • [建議] 屬性所關(guān)聯(lián)的實(shí)例變量的命名必須遵守以下劃線作為前綴的規(guī)則。屬性的名字應(yīng)該與成員變量去掉下劃線后綴的名字一模一樣附迷。@property后面緊跟括號(hào)惧互,不留空格。

示例

@interface MyClass : NSObject
@property(copy, nonatomic) NSString *name;
@end

@implementation MyClass
// No code required for auto-synthesis, else use: //
@synthesize name = _name;
@end

14喇伯、沒有實(shí)例變量的接口

  • [強(qiáng)制] 沒有聲明任何實(shí)例變量的接口喊儡,應(yīng)省略空大括號(hào)。

示例

@interface MyClass : NSObject // Does a lot of stuff 
- (void)fooBarBam; 
@end
 
@interface MyClass : NSObject { } // Does a lot of stuff 
- (void)fooBarBam; 
@end

15稻据、自動(dòng)synthesize實(shí)例變量

  • [建議] 優(yōu)先考慮使用自動(dòng) synthesize 實(shí)例變量艾猜。

示例


@interface Foo : NSObject <Thingy>
// A guy walks into a bar.
@property(nonatomic, copy) NSString *bar;
@end

// Implementation file
@interface Foo ()
@property(nonatomic, retain) NSArray *baz;
@end

@implementation Foo
@synthesize widgetName = _widgetName;
@end

16、數(shù)據(jù)格式

-[強(qiáng)制]suggest:
NSDictionary *userDic =
@{@"login_phone": theApp.user.phone? theApp.user.phone : @"",
@"timestamp" : timestamp,
@"version" : kAppstore_Version,
@"encoding" : @"utf-8",
@"client_type": @"1",
@"app_code" : VKNetContext.app_ProCode,
@"push_id" : theApp.apnsToken ? theApp.apnsToken : @""};

avoid:
NSNumber *timestamp = [NSNumber numberWithInt:[[NSDate date] timeIntervalSince1970]];
NSDictionary *userDic = @{@"login_phone": theApp.user.phone? theApp.user.phone : @"",@"timestamp" : timestamp,@"version": kAppstore_Version,@"encoding" : @"utf-8",@"client_type": @"1",@"app_code" : VKNetContext.app_ProCode,@"push_id" : theApp.apnsToken ? theApp.apnsToken : @""};

六攀甚、性能調(diào)優(yōu)

這里只列一些需要注意的點(diǎn)箩朴,具體原理參見iOS應(yīng)用性能調(diào)優(yōu)的25個(gè)建議和技巧

入門級(jí)(這是些你一定會(huì)經(jīng)常用在你app開發(fā)中的建議)

    1. 用ARC管理內(nèi)存
    1. 在正確的地方使用reuseIdentifier
    1. 盡可能使Views不透明
    1. 避免龐大的XIB
    1. 不要block主線程
    1. 在Image Views中調(diào)整圖片大小
    1. 選擇正確的Collection
    1. 打開gzip壓縮

中級(jí)(這些是你可能在一些相對(duì)復(fù)雜情況下可能用到的)

    1. 重用和延遲加載Views
    1. Cache, Cache, 還是Cache!
    1. 權(quán)衡渲染方法
    1. 處理內(nèi)存警告
    1. 重用大開銷的對(duì)象
    1. 使用Sprite Sheets
    1. 避免反復(fù)處理數(shù)據(jù)
    1. 選擇正確的數(shù)據(jù)格式
    1. 正確地設(shè)定Background Images
    1. 減少使用Web特性
    1. 設(shè)定Shadow Path
    1. 優(yōu)化你的Table View
    1. 選擇正確的數(shù)據(jù)存儲(chǔ)選項(xiàng)

進(jìn)階級(jí)(這些建議只應(yīng)該在你確信他們可以解決問題和得心應(yīng)手的情況下采用)

    1. 加速啟動(dòng)時(shí)間
    1. 使用Autorelease Pool
    1. 選擇是否緩存圖片
    1. 盡量避免日期格式轉(zhuǎn)換
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秋度,一起剝皮案震驚了整個(gè)濱河市炸庞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荚斯,老刑警劉巖埠居,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異事期,居然都是意外死亡滥壕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門兽泣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绎橘,“玉大人,你說我怎么就攤上這事〕屏郏” “怎么了涮较?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冈止。 經(jīng)常有香客問我狂票,道長,這世上最難降的妖魔是什么熙暴? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任闺属,我火速辦了婚禮炬藤,結(jié)果婚禮上壤靶,老公的妹妹穿的比我還像新娘驯嘱。我一直安慰自己卖丸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布煮岁。 她就那樣靜靜地躺著旦委,像睡著了一般铅协。 火紅的嫁衣襯著肌膚如雪匠楚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天厂财,我揣著相機(jī)與錄音芋簿,去河邊找鬼。 笑死璃饱,一個(gè)胖子當(dāng)著我的面吹牛与斤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荚恶,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼撩穿,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了谒撼?” 一聲冷哼從身側(cè)響起食寡,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廓潜,沒想到半個(gè)月后抵皱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辩蛋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年呻畸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悼院。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伤为,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出据途,到底是詐尸還是另有隱情绞愚,我是刑警寧澤叙甸,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站爽醋,受9級(jí)特大地震影響蚁署,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚂四,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一光戈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧遂赠,春花似錦久妆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抑诸,卻和暖如春烂琴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜕乡。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工奸绷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人层玲。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓号醉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辛块。 傳聞我的和親對(duì)象是個(gè)殘疾皇子畔派,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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

  • iOS編程規(guī)范0規(guī)范 0.1前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開發(fā)人員編寫出簡(jiǎn)潔、可維護(hù)润绵、可靠线椰、可 測(cè)試、高效...
    iOS行者閱讀 4,446評(píng)論 21 35
  • 概要 Objective-C是一門面向?qū)ο蟮膭?dòng)態(tài)編程語言尘盼,主要用于編寫iOS和Mac應(yīng)用程序士嚎。關(guān)于Objectiv...
    DreamMmMmM閱讀 1,157評(píng)論 0 7
  • 點(diǎn)擊查看簡(jiǎn)書原文 一. 格式化代碼 1. 指針“*”號(hào)的位置 2. 空格 VS tabs ? 只允許使用空格,將編...
    漂泊海上的大土豆閱讀 1,832評(píng)論 0 8
  • 作為萬物之靈悔叽,人應(yīng)該是唯一可以感受到脆弱的生物莱衩。 我們從小受的教育,都是告誡大家要堅(jiān)強(qiáng)娇澎,泰山崩于前而...
    Jenny_Yuan閱讀 267評(píng)論 1 1
  • 慈母手中線, 游子身上衣。臨行密密縫, 意恐遲遲歸括细。誰言寸草心, 報(bào)得三春暉伪很。 清明過后,又開始離家上班奋单,心中卻時(shí)...
    可可熊Q閱讀 289評(píng)論 1 4