工作總結(jié) | iOS規(guī)范補充

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 or NSDictionary
  • All objects are NSString, NSNumber, NSArray, NSDictionary, or NSNull
  • All dictionary keys are NSStrings
  • NSNumbers are not NaN 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ù)字符串纺酸,務必獨立出對應CategoryDataInfoKeys擴展文件,方便查詢址否、注釋餐蔬、全局引用、修改和拼寫糾錯:
// 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組合形式缠黍,如needsAutoDisplayshouldAutoRotateOrientation药蜻、isFinished瓷式、hasDatahasNoData等;

  • 對于一些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
  • 對于一些typedefBlock惋砂,命名最好指明Block的類別+用途妒挎,如TALPlayerLogReportHandler,如果有功能性區(qū)分的話西饵,則可以定義為TALPlayerLogReportCompletionHandler酝掩、TALPlayerLogReportSuccessHandlerTALPlayerLogReportFailureHandler注意是名詞組合形式眷柔;
  • 調(diào)用Block時期虾,一定要對block對象進行nil值判斷,防止崩潰handler ? handler() : nil;
  • 所有對于NSString校驗的地方驯嘱,都應該校驗其length > 0彻消,而不是!str
  • 所有對于NSURL校驗的地方宙拉,都應該校驗其[URL.scheme.lowercaseString isEqualToString: @"https"]方式,而不是!URL丙笋;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谢澈,一起剝皮案震驚了整個濱河市煌贴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锥忿,老刑警劉巖牛郑,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異敬鬓,居然都是意外死亡淹朋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門钉答,熙熙樓的掌柜王于貴愁眉苦臉地迎上來础芍,“玉大人,你說我怎么就攤上這事数尿÷匦裕” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵右蹦,是天一觀的道長诊杆。 經(jīng)常有香客問我,道長何陆,這世上最難降的妖魔是什么晨汹? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮贷盲,結(jié)果婚禮上淘这,老公的妹妹穿的比我還像新娘。我一直安慰自己晃洒,他們只是感情好慨灭,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著球及,像睡著了一般氧骤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吃引,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天筹陵,我揣著相機與錄音,去河邊找鬼镊尺。 笑死朦佩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的庐氮。 我是一名探鬼主播语稠,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仙畦?” 一聲冷哼從身側(cè)響起输涕,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慨畸,沒想到半個月后莱坎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡寸士,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年檐什,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弱卡。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡乃正,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谐宙,到底是詐尸還是另有隱情烫葬,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布凡蜻,位于F島的核電站搭综,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏划栓。R本人自食惡果不足惜兑巾,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忠荞。 院中可真熱鬧蒋歌,春花似錦、人聲如沸委煤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碧绞。三九已至府框,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間讥邻,已是汗流浹背迫靖。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兴使,地道東北人系宜。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像发魄,于是被迫代替她去往敵國和親盹牧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

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

  • 前言 說是前言,其實也是本文誕生的目的汰寓。隨著公司業(yè)務的不斷增加吆寨,功能的快速迭代,app的業(yè)務線越來越多踩寇,代碼體積變...
    Yealink閱讀 5,306評論 0 13
  • 前言 說是前言,其實也是本文誕生的目的六水。隨著公司業(yè)務的不斷增加俺孙,功能的快速迭代,app的業(yè)務線越來越多掷贾,代碼體積變...
    夢翔_d674閱讀 1,492評論 0 2
  • 前言說是前言睛榄,其實也是本文誕生的目的。隨著公司業(yè)務的不斷增加想帅,功能的快速迭代场靴,app的業(yè)務線越來越多,代碼體積變得...
    Mr_yinwei閱讀 643評論 0 0
  • 約定 在我看來港准,開發(fā)規(guī)范像是一條可供參考的標準線旨剥。不同開發(fā)者可以根據(jù)這條標準線來規(guī)范自己的開發(fā)行為,尤其是在大的項...
    xxzsxxzs閱讀 624評論 1 0
  • 搜狐視頻iOS團隊 Objective-C 編碼規(guī)范 介紹 團隊中長期以來存在各人不同的編碼方式和習慣浅缸,導致代碼中...
    DiligentLeo閱讀 763評論 0 5