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ā)中的建議)
- 用ARC管理內(nèi)存
- 在正確的地方使用reuseIdentifier
- 盡可能使Views不透明
- 避免龐大的XIB
- 不要block主線程
- 在Image Views中調(diào)整圖片大小
- 選擇正確的Collection
- 打開gzip壓縮
中級(jí)(這些是你可能在一些相對(duì)復(fù)雜情況下可能用到的)
- 重用和延遲加載Views
- Cache, Cache, 還是Cache!
- 權(quán)衡渲染方法
- 處理內(nèi)存警告
- 重用大開銷的對(duì)象
- 使用Sprite Sheets
- 避免反復(fù)處理數(shù)據(jù)
- 選擇正確的數(shù)據(jù)格式
- 正確地設(shè)定Background Images
- 減少使用Web特性
- 設(shè)定Shadow Path
- 優(yōu)化你的Table View
- 選擇正確的數(shù)據(jù)存儲(chǔ)選項(xiàng)
進(jìn)階級(jí)(這些建議只應(yīng)該在你確信他們可以解決問題和得心應(yīng)手的情況下采用)
- 加速啟動(dòng)時(shí)間
- 使用Autorelease Pool
- 選擇是否緩存圖片
- 盡量避免日期格式轉(zhuǎn)換