养成良好的编码习惯

美化代码

  • 只使用空格而不要使用tab,且一次缩进两个空格。应该将xcode设置成自动将制表符替换成空格,缩进为2空格
  • 方法的大括号和其他的大括号(if/else/switch/while 等) 总是在同一行开始,在新起一行结束
  • 尽量让你的代码保持在 80 列之内,通过设置 Xcode > Preferences > Text Editing > Show page guide,来使越界更容易被发现。
  • if语句不要省略{ }
  • 方法名与方法类型 (-/+ 符号)之间应该以空格间隔
  • @public 和 @private 访问修饰符应该以一个空格缩进。
  • 方法的调用要么所有参数一行,要么每个参数一行且保证冒号都对其,当第一个关键字比其它的短时,保证下一行至少有 4 个空格的缩进

最佳实践

  • 不要使用尤达表达式
//尤达是星球大战中的jidi武师,他说话的语法都是很奇怪的倒装句,这里泛指这样的代码
if ([@8 isEqual:a]) // 错误
if ([a isEqual:@8]) // 正确
  • 不要和YES,NO,Nil这些值做比较
if (great == YES) //错误
if (great)        //正确
  • 不过过度使用if嵌套,有时可以用return减少if嵌套
- (void)someMethod {
  if (![someOther boolValue]) {
      return;
  }
  //Do something important
}
  • 复杂的表达式应该拆分多个语义更明确的字句
  • 三元运算符 ? 应该只用在它能让代码更加清楚的地方
  • 注意stong,weak,copy,assign的正确使用
  • 尽量避免使用c的基本类型 ,例如:
  int -> NSInteger
  unsigned -> NSUInteger
  float -> CGFloat
  动画时间 -> NSTimeInterval
  enum -> NS_ENUM
  • 合理使用参数断言,当特定参数的条件不满足时,使用 NSParameterAssert() 来断言条件是否成立或是抛出一个异常
  • 工厂方法或类构造器方法,返回类型需要使用instancetype而不要用id类型,方法中需要使用 [[xxx class]alloc] init]方法构造对象而不要用[[XXXClass alloc]init]
  • 永远不要在init dealloc方法中使用 getter,setter,.属性等,你应当直接访问实例变量
  • 类的构成方法(init方法)需要遵守Designated Secondary原则。这点在swift中被强制规定init和convenience构造方法。
designated 初始化方法一般提供所有的参数,有且只有一个,而secondary 初始化方法是一个或多个,并且提供一个或者更多的默认参数来调用 designated初始化方法
  • 定义你的 designated initializer,确保调用了直接超类的 designated initializer。
  • 重载直接超类的 designated initializer。调用你的新的 designated initializer。
  • 为新的 designated initializer 写文档。
  • 永远不从 designated initializer 里面调用一个 secondary initializer
  • 注意初始化模式的合理使用(类簇,单例)
  • 合理使用懒加载Lazy loading
当实例化一个对象需要耗费很多资源,或者配置一次就要调用很多配置相关的方法而你又不想弄乱这些方法时,我们需要重写 getter 方法以延迟实例化
  • 要重写类的相等性时,需要同时实现isEqual和hash方法
  • 常量推荐静态常量的声明,如果要暴露给外部,使用extern关键词,例如:
extern NSString *const ZOCCacheControllerDidClearCacheNotification;
static NSString * const ZOCCacheControllerDidClearCacheNotification = @"ZOCCacheControllerDidClearCacheNotification";
  • 定义你自己的 NSNotification 的时候你应该把你的通知的名字定义为一个字符串常量
// Foo.h
extern NSString * const ZOCFooDidBecomeBarNotification
// Foo.m
NSString * const ZOCFooDidBecomeBarNotification = @"ZOCFooDidBecomeBarNotification";
  • objc中可以合理使用代码块的特性,使局部变量更清晰
//代码块如果在闭合的圆括号内的话,会返回最后语句的值
NSURL *url = ({
    NSString *urlString = [NSString stringWithFormat:@"%@/%@", baseURLString, endpoint];
    [NSURL URLWithString:urlString];
});
  • 合理使用Pragma Mark区分:不同功能组的方法,protocols 的实现,对父类方法的重写,View 的生命周期,自定义访问器,

  • 方法注释最好用/** 开头,换行后第一句写方法的一句话描述,空一行后在写余下的描述,
    还可以使用 | 来引用注释中的变量名及符号名而不是使用引号,例如
    // Sometimes we need |count| to be less than zero.

  • 函数定义中的block参数应该尽量放到最后一个参数,把需要提供的数据和错误信息整合到一个单独 block 中,比分别提供成功和失败的 block 要好

- (void)downloadObjectsAtPath:(NSString *)path
                   completion:(void(^)(NSArray *objects, NSError *error))completion;
  • 函数定义中的error参数,尽可能方法函数的最后一个函数,并且遵循,数据为空,那么error不为nil,和error不为空,数据必须为空
  • block合理的使用self,weakself,strongSelf
一般来说:如果block不是属性则使用self,是属性但block中调用单个self的方法时用weakSelf,多个方法用strongSelf
  • block如果一行可以写完块,则没必要换行,块内的代码须按 4 空格缩进,果块太长,比如超过 20 行,建议把它定义成一个局部变量,然后再使用该变量,
  • 不要使用new方法创建对象

命名规范

方法的命名:

  • 不要使用and连接参数,第一个参数可以用with,若有动词可以使用for,委托用did,will表示状态
  • 如果方法表示让对象执行一个动作,使用动词打头来命名
  • category方法前加上自己的小写前缀以及下划线,比如- (id)zoc_myCategoryMethod
  • 方法的定义,当一行有非常多的参数,更好的方式是将每个参数单独拆成一行。如果使用多行,将每个参数前的冒号对齐,当第一个关键字比其它的短时,保证下一行至少有 4 个空格的缩进

类,协议命名

  • 类名应该以三个大写字母作为前缀(双字母前缀为 Apple 的类预留),首字母大写
  • 方法名首字母小写
  • 变量名首字母小写,私有变量名称可以用"_"作为后缀,例如myInstanceVariable_
  • 常量命名可以使用字母'k'作为前缀
  • 子类命名应该把说明性的部分放在前缀和父类名的在中间,例如ZOCNetworkClient => ZOCTwitterNetworkClient

属性

  • 属性应该尽可能的描述性地命名,避免缩写,并且小写字母开头的驼峰命名。 *符号要靠近名称,如NSString *text
  • 属性尽可能使用.符号调用
  • 属性定义排列顺序:原子性,读写性,内存管理,例如 @property (nonatomic, readwrite, copy) NSString *name;
  • 私有属性定义在实现文件中。
## 参考
-   [objc禅翻译](https://github.com/oa414/objc-zen-book-cn/)
-   [Google 开源项目风格指南 - objc](http://zh-google-styleguide.readthedocs.org/en/latest/google-objc-styleguide/contents/)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容