关于Objective-C代码规范的22条总结

1.头文件#import的顺序

写法模板

#import <系统库>
#import <第三方库>
#import “其他类”

建议的写法

#import <UIKit/UIKit.h>
#import <Google/Analytics.h>
#import "GBOrderEmptyView.h"

不建议的写法

#import <UIKit/UIKit.h>

#import <Google/Analytics.h>

#import "GBOrderEmptyView.h"

2.@Class的写法

写法模板:@class class1,class2;
建议的写法:

@class UIView,UIImage;

不建议的写法

@class UIPress;
@class UIPressesEvent;

3.@Interface的写法

@interface 类名 : 父类 <协议1,2="">
@interface和类名中间一个空格
类名后紧跟: 之后空格加上父类协议之间用,空格分割

建议的写法

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITableViewDataSOurce>

不建议的写法

@interface AppDelegate:UIResponder <UIApplicationDelegate,UITableViewDataSOurce>

4.@protocol的写法

写法的模板
@protocol 协议名称 <协议1,协议2="">
@protocol和协议的名称有空格 协议的名称和其他协议有空格 其他协议之间有空格

建议的写法

@protocol UIResponderStandarEditActions <NSObject>

不建议的写法

@protocol UIResponderStandarEditActions<NSObject>

5.@property的写法

@property (关键词, 关键词) 类 *变量名称;
关键词用,空格分割 类前后空格

正确的写法

@property (strong, noatomic) UIWindow *window;

不建议的写法

@property (strong, noatomic) UIWindow * window;

6.h头文件方法写法

写法模板

@interface
方法的参数在一排显示
方法之间保留一行
第一个方法和@interface保留空行
最后一个方法和@end保留空行

建议的写法

@interface Text : NSObject

- (void)testFunction;

@end

错误的写法

@interface Text : NSObject
- (void)testFunction;
@end

7.声明const的字符串

开头用k标识
推荐k+模板名字首字母大写+作用名称 防止和其他的重复
比如:CartViewModel类需要声明更新购物车列表的通知
kCVMNoticationUpdateCartList
如果是声明Cell的重用字符
k+cell的名称+identifier
比如: GBHomeItemTableViewCell的标识符
kGBHomeItemTableViewCellIdentifier
Const声明字符串位置
如果是需要声明在h里面让其他的类用到需要在h声明m实现

声明

UIKIT_EXTERN NSString *const kNoticationUpdateCartList;

实现

NSString *const kNoticationUpdateCartList = @"kNoticationUpdateCartList";

对于如果导入是UIKit类就使用UIKIT_EXTERN?如果是Founction使用关键词FOUNDATION_EXTERN
如果只在本类使用只用写实现 不用写声明。


8.pragma mark的使用

对于属性的不同作用 比如设置颜色的 设置字体的 设置其他样式 的可以进行分组
对于方法的作用分类 比如添加功能 删除功能的
对于其他的代理方法 Get Set方法 Init初始化方法

建议的写法

#pragma mark - Init

#pragma mark - Request

#pragma mark - Delegate

#pragma mark - DataSource

#pragma mark - Setter

#pragma mark - Getter

9.BOOL类型属性的声明

属性set不要带is get要带is

建议写法

@property(noatomic, assign, getter=isUserLogin) BOOL userLogin;

不建议的写法

@property(noatomic, assign) BOOL userLogin;

10.if判断里面的条件要提取出来

对于if里面很多的判断条件 要提取出来 方便之后进行断点测试

建议的写法

BOOL isTrue = 5 > 3;
if(isTrue) {
}

不建议的写法

if(5 > 3){
}

11.对于声明NSString const要对适应对应的模块

比如系统的 NSNotificationName

typedef NSString *NSNotificationName NS_EXTENSIBLE_STRING_ENUM;

建议的写法

typedef NSString *NSStringConfigProjectName;
FOUNDATION_EXPORT NSStringConfigprojectName const kConfigProjectPluginDebugBaseUrlString;

不建议的写法

FOUNDATION_EXPORT NSStringConfigprojectName const kConfigProjectPluginDebugBaseUrlString;

12.对于#define宏命名

单词全部的大写 单词之间用_分割
建议的写法

#define NS_AVAILABLE_IOS(_ios) CF_AVAILABLE_IOS(_ios)

不建议的写法

#define NS_AVAailableIos(_ios) CF_AVAILABLE_IOS(_ios)

13.block的命名规范

之前研究过很多的第三方的命名 对于苹果官方的没找到
有CallBack结尾 Complete结尾 Block结尾 还有CompletionHandle结尾的
我看到苹果很多的结尾都是用CompletionHandle结尾
大部分命名是Block我们按照Block命名

建议的写法

typedef void(DidUpdateViewCompletionHandle)(void)

错误的写法

typedef void(DidUpdateViewCallBack)

14.多用类型常量 少用#define

常量(预定义,枚举,局部常量等)使用小写k开头的驼峰法,比如kInvalidHandle,kWritePerm
建议的写法

static const NSTimeInterval kAnimationDuration = 0.3;

不建议的写法

#define ANIMATION_DURATION 0.3

15.提供全能的初始化方法

对于初始化参数有很多 但是不是一定全部使用的可以提供多个初始化方法

建议的写法

- (instancetype)initWithFrame:(CGRect)frame;
- (instancetype)initWithPerson:(GBPersonModel *)person;
- (instancetype)initWithFrame:(CGRect)frame person:(GBPersonModel *)person;

不建议的写法

- (instancetype)initWithFrame:(CGRect)frame person:(GBPersonModel *)person;

16.如果建议的使用Block和代理

我觉得代理可以用在写控件需要数据源赋值 和一些事件回调的时候使用
我查阅了苹果的block基本上都是执行一个时间 需要异步回调就使用block
如果没有主动执行动作 而是监听异步的回调 建议用代理

建议的写法

TestName *name = [[TestName alloc] init];
name.delegate = self;
[name searchText:text completionHandel:^(BOOL isExit) {

}];

- (void)name:(TestName)name resultTextHaveChanged:(NSString *)text {

}

不建议的写法

TestName *name = [[TestName alloc] init];
name.delegate = self;
[name searchText:text completionHandel:^(BOOL isExit) {

}];

name.resultTextHaveChange = ^(NSString *text) {

};

17.养成习惯把按照方法功能到分类里面

对于一些有按照功能类型的方法划分在一个分类里面 分类和之前类写在同一个文件

建议的写法

@interface WWPerson : NSObject
@end

@interface WWPerson (Friend)
// 朋友
- (void)addFriend:(WWPerson *)friend;
- (void)deleteFriend:(WWPerson *)friend;
@end
@interface WWPerson (Play)
// 娱乐
- (void)playSound;
- (void)playGame;
@end

不建议的写法

@interface WWPerson : NSObject

// 朋友
- (void)addFriend:(WWPerson *)friend;
- (void)deleteFriend:(WWPerson *)friend;

// 娱乐
- (void)playSound;
- (void)playGame;
@end

18.非要在自己类的分类添加读写的属性 可以用语法糖

可以利用主类的私有变量

建议的写法

@interface WWCustomView : UIView

@end
@interface WWCustomView (Add)

@property(noatomic, copy) NSString *name;

@end
#import "WWCustomView.h"
@implementation WWCustomView {
  NSString * _name;
}
@end

@implementation WWCustomView (Add)

- (void)setName:(NSString *)name {
  _name = name;
}

- (NSString *)name {
    return _name;
}

@end

不建议的写法

- (void)setName:(NSString *)name {
        objc_setAssociatedObject(self, "name", name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name {
    return objc_getAssociatedObject(self, "name");
}

对于给第三方和系统的类非要添加属性 可以使用runtime。


19.需要便利字典和数组的内容 并且需要索引enumerator

[names enumerateObjectsUsingBlock:^(NSString *  _Nonnull name, NSUInteger idx, BOOL * _Nonnull stop) {
        
 }];

不建议的写法

for (int i = 0; i < names.count; i ++) {
        NSString *name = names[i];
 }

20.黄金大道

建议的写法

 if (name.length <= 0) {
        return;
 }
 if (![name isEqualToString:@"zhangsan"]) {
        return;
 }
 ......

不建议的写法

 if (name.length > 0) {
   if ([name isEqualToString:@"zhangsan"]) {
      ....
   }
 }

21.复杂的表达式

BOOL nameContainsSwift = [sessionName containsString:@"Swift"];
BOOL isCurrentYear = [sessionDateCompontents year] == 2014;
BOOL isSwiftSession = nameContainsSwift ** isCurrentYear;
if (isSwiftSession) {
  // Do something very cool
}

不建议的写法

if ([sessionName containsString:@"Swift"] && [sessionDateCompontents year] == 2014) {
  // Do something very cool
}

22.类别命名
类名+标识+扩展 (UIImageView + HP + Web)
例:如果我们想要创建一个基于UIImageView 的类别用于网络请求图片,我们应该把类别放到名字是 UIImageView+HPWeb.h 的文件里。UIImageView为要扩展的类名,HP为专属标识,Web为扩展的功能。
类别的方法应该都是用一个前缀(型如hp_myCategoryMethodOnAString),以防止Objective-C代码在单名空间里冲突。如果代码本来就不考虑共享或在不同的地址空间,方法命名规则就没必要恪守了。
类别HPWeb头文件,UIImageView+HPWeb.h 如下:

@interface UIImageView(HPWeb)
- (void)hp_setImageWithUrlString:(NSString *)urlStr;
@end
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容