Pod update注意
- 先執(zhí)行
pod repo update 公司內(nèi)部庫specs
- 再執(zhí)行
pod update --no-repo-update
這樣就不會update github_specs陨舱,速度快
JSONSerialization
- 涉及到
JSON Object
<->NSData
數(shù)據(jù)轉(zhuǎn)換的地方濒析,注意對NSError
的處理和JSON Object
合法性的校驗,如:
BOOL validate = [NSJSONSerialization isValidJSONObject:parament];
if (!validate) {
// 對不是合法的JSON對象錯誤進行處理
return;
}
NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parament options:NSJSONWritingPrettyPrinted error:&error];
if (error) {
// 對數(shù)據(jù)轉(zhuǎn)換錯誤進行處理
return;
}
合法JSON對象滿足:
- Top level object is an
NSArray
orNSDictionary
- All objects are
NSString
,NSNumber
,NSArray
,NSDictionary
, orNSNull
- All dictionary keys are
NSStrings
NSNumbers
are notNaN or infinity
補充一些代碼規(guī)范昔案、開發(fā)約定
- 寫
if else
語句時可以else
不換行緊跟if
的}
括號欣范,但寫if else if
時戒悠,為了保持條件{}
的可讀性扣甲,務必請換行書寫:
// if else
BOOL flag = YES;
if (flag) {
} else {
}
// if else if
BOOL flag = YES;
BOOL elseIfFlag = (1+1-1+2 == 5);
if (flag) {
}
// 這里換行書寫
else if(elseIfFlag) {
}
- 對于
@property
聲明的屬性,如果初始化設置復雜李剖,請采用懶加載getters
方式建峭,對于簡單初始化的凌受,應在.m
文件中提供統(tǒng)一的-initData
初始化數(shù)據(jù)的方法店雅。
/// 懶加載方式-內(nèi)部配置
@property(nonatomic, strong)UIView *redView;
/// 統(tǒng)一初始化
@property(nonatomic, strong)NSMutableArray *dataSourceArray;
/// 統(tǒng)一數(shù)據(jù)初始化
- (void)initData{
_dataSourceArray = [NSMutableArray new];
}
/// 懶加載
- (UIView *)redView{
if (!_redView) {
_redView = [UIView new];
_redView.backgroundColor = UIColor.redColor;
}
return _redView;
}
- 對于
NSDictionary政基、NSArray
等的初始化,為提高可讀性起見闹啦,建議采用語法糖的初始化方式:
_dataSourceArray = [@[@"1", @"2"] mutableCopy];
_parameters = [@{@"action": @"add", @"id": @"22"} mutableCopy];
// X: 不推薦這樣做
_dataSourceArray = [NSMutableArray new];
[_dataSourceArray addObject:@"1"];
[_dataSourceArray addObject:@"2"];
_parameters = [NSMutableDictionary new];
[_parameters setValue:@"add" forKey:@"action"];
[_parameters setValue:@"22" forKey:@"id"];
- 對于
Category
中的對外公有方法沮明,務必采用categoryName_funcName
的命名方式,以區(qū)別于主類里沒有前綴的方法:
// TALPlayer+LogReport.h
/// 加載播放器
- (void)logReport_loadPlayer;
/// 開始播放
- (void)logReport_startPlay;
- 對于
Category
里的私有同名方法窍奋,可采用下劃線方式如_mainClassFuncName
以區(qū)別. - 對于主類里的私有屬性荐健,在多個
Category
訪問時酱畅,可采用屬性中間件的方式,拆出一個獨立的MainClass+InternalProperty
來提供一些getters
方法:
// TALPlayer+InternalProperty.h
- (TALPlayerLogModel *)internalProperty_logModel;
- (TALPlayerStaticsModel *)internalProperty_staticsModel;
// TALPlayer+InternalProperty.m
- (TALPlayerLogModel *)internalProperty_logModel{
// 這里為方便以后調(diào)試斷點用江场,建議拆開2行寫
id value = [self valueForKey:@"logModel"];
return value;
}
- 對于需要跟服務器交互的網(wǎng)絡請求參數(shù)字符串纺酸,務必獨立出對應
Category
的DataInfoKeys
擴展文件,方便查詢址否、注釋餐蔬、全局引用、修改和拼寫糾錯:
// TALPlayer+LogReportDataInfoKeys.h
/// action
extern NSString *const LogReportDataInfoActionKey;
/// 心跳
extern NSString *const LogReportDataInfoActionHeartBeatKey;
/// 嚴重卡頓
extern NSString *const LogReportDataInfoActionSeriousBufferKey;
// TALPlayer+LogReportDataInfoKeys.m
// action
NSString *const LogReportDataInfoActionKey = @"action";
/// 心跳
NSString *const LogReportDataInfoActionHeartBeatKey = @"heartbeat";
/// 嚴重卡頓
NSString *const LogReportDataInfoActionSeriousBufferKey = @"seriousbuffer";
// 使用
#import "TALPlayerLogReportDataInfoKeys.h"
NSMutableDictionary *info = [NSMutableDictionary new];
info[LogReportDataInfoActionKey] = LogReportDataInfoActionHeartBeatKey;
// info[XXXKey] = value;
- 對于
.h
及.m
文件中默認#pragma mark
的規(guī)范佑附,推薦如下:
// XXX.h
#pragma mark - Protocol
#pragma mark - Properties
#pragma mark - Methods
// XXX.m
#pragma mark - Consts
#pragma mark - UI Components
#pragma mark - Data Properties
#pragma mark - Initial Methods
#pragma mark - Lifecycle Methods
#pragma mark - Override Methods
#pragma mark - Public Methods
#pragma mark - Private Methods
#pragma mark - XXXDelegate
#pragma mark - Getters
#pragma mark - Setters
如上相關(guān)
#pragma
字符在Xcode中的自動配置樊诺,有機會我會單獨分享給大家。
Xcode FileTemplate路徑:Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/Source/Cocoa Touch Class.xctemplate/
- 對于OC文件中注釋規(guī)范說明:
//MARK: mark here(類似于#pragma mark音同,只不過沒有橫線)
//TODO: todo here
//FIXME: fix me later
//???: What is this shit
//!!!: DO NOT TOUCH MY CODE
說明:
- 對于單行注釋词爬,盡量用
//
代替/**/格式,
权均,務必請在//
后加一個空格顿膨,再進行內(nèi)容補充,如:// 這是單行注釋
而不要寫成//這是單行注釋
- 對于SDK內(nèi)部私有方法螺句,如果無參數(shù)虽惭,則采用
/// 這是無參數(shù)方法注釋
格式; - 對于SDK需要向外暴露的接口方法注釋蛇尚,請務必按照
AppleDoc
編寫芽唇,寫明@param、@return
等:
/**
* 這是一個demo方法
* @param param1 第一個參數(shù)
* @param param2 第二個參數(shù)
* @return BOOL值
*/
- (BOOL)thisIsADemoFuncWithParam1: (NSString *)param1
param2: (NSInteger)param2{
return NO;
}
對于
@property
申明的SDK公開屬性取劫,務必寫成/* 這是SDK公開屬性注釋 */
匆笤,方便調(diào)用時Xcode提示;對于SDK內(nèi)部使用的屬性谱邪,最好寫成
/// 這是屬性注釋
而不是/**/
炮捧;另外,務必讓對于
>=2
個參數(shù)的方法惦银,各個參數(shù)折行對齊咆课,務必保持.h
和.m
方法參數(shù)格式一致;對于方法名的統(tǒng)一性說明:
如果方法是功能性的扯俱,處理某些事件书蚪、計算、數(shù)據(jù)處理等的
私有方法
迅栅,則可定義方法名為handleXXX:
殊校,如-handleRedBtnClick:
、-handleResponsedData:
读存、-handlePlayerEvent:
等为流;對于一些需要暴露的公有方法呕屎,則命名最好按照
n
的功能命名,如對于一個TALPlayer
它可以play
敬察、stop
秀睛、resume
等;對于可以
switch
兩種狀態(tài)切換的狀態(tài)方法静汤,最好命名為toggleXXX:(BOOL)on
琅催,如- (void)toggleMute:(BOOL)on
;
對于一些狀態(tài)描述性的屬性虫给,可以用
needs藤抡、is、should抹估、has
+adj/vb
組合形式缠黍,如needsAutoDisplay
、shouldAutoRotateOrientation
药蜻、isFinished
瓷式、hasData
或hasNoData
等;對于一些
NS_ENUM
枚舉定義语泽,務必遵循統(tǒng)一前綴方式:
typedef enum : NSUInteger {
TALPlayerEventA = 0,
TALPlayerEventB,
TALPlayerEventC,
} TALPlayerEvent;
// 或者
typedef NS_ENUM(NSUInteger, MyEnum) {
MyEnumValueA,
MyEnumValueB,
MyEnumValueC,
};
- 對于一些全局宏的定義贸典,務必
SDK前綴全大寫_NAME_
組合如TALPLAYER_GLOBAL_MACRO_NAME
,對于const
類型的常量踱卵,務必加上k
前綴廊驼,命名為kConstValue
; - 對于一些
typedef
的Block
惋砂,命名最好指明Block的類別+用途
妒挎,如TALPlayerLogReportHandler
,如果有功能性區(qū)分的話西饵,則可以定義為TALPlayerLogReportCompletionHandler
酝掩、TALPlayerLogReportSuccessHandler
、TALPlayerLogReportFailureHandler
注意是名詞組合形式眷柔; - 調(diào)用
Block
時期虾,一定要對block
對象進行nil
值判斷,防止崩潰handler ? handler() : nil;
- 所有對于
NSString
校驗的地方驯嘱,都應該校驗其length > 0
彻消,而不是!str
; - 所有對于
NSURL
校驗的地方宙拉,都應該校驗其[URL.scheme.lowercaseString isEqualToString: @"https"]
方式,而不是!URL
丙笋;