Objective-C代码规范
第一话 官方代码规范
Objective-C 编码规范,内容来自苹果、谷歌的文档翻译,自己的编码经验和对其它资料的总结。
概要
Objective-C 是一门面向对象的动态编程语言,主要用于编写 iOS 和 Mac 应用程序。关于 Objective-C 的编码规范,苹果已经有很好的总结:
本文主要整合了对上述文档的翻译、作者自己的编程经验和其他的相关资料,为公司总结出一份通用的编码规范。
网站:http://www.cocoachina.com/ios/20150508/11780.html
第二话 自己的一些经验之谈
类(Class)命名原则
就拿“NSMutableArray”来说
NS --- 前缀(Prefix)我的理解是表示类所属的“包”,这里的NS就表示的是Cocoa的基础类库,取公司名项目名什么的。(NS是NextStep公司的简写,里面的渊源就不细说了- -)前缀的意义就在于比较直观的划分了类的所属和范围。像Cocos2d里的前缀就是CC,box2d里面是B2,UserInterface->UI,CoreFoundation->CF,CoreGraphics->CG。如果我也能写一个开源架构或模块的话,我应该会取“SY”或是“Sunny”吧 :)
MutableArray --- 类名,简短明确的形容类所表示的内容。首字母大写,驼峰标示。另外值得注意的是,由于NSMutableArray是NSArray的扩展子类,本质上形容的都是Array,所以应该保留父类的识别字样“Array”,但NSObject到NSArray不应该起名成NSArrayObject,也是避免了语义的重叠。
成员变量与属性存取器(Accessor)命名原则
这也是让我纠结了挺久,一直不懂为什么很多代码里面类成员变量出现了下划线"_",而属性存取方法@property声明时不加下划线,实现时@synthesize又令两个名字相等。
@interface SunnyTest : NSObject { NSArray * _array; } @property (nonatomic,retain) NSArray * array; @end
@implementation SunnyTest @synthesize array = _array; @end
这样做的原因很简单,就是不暴露实例的成员变量,外界只能用@property声明的存取名来访问成员变量,所以就用下滑线加以区分。
但在类内方法访问成员变量时就直接使用带下划线的名字,个人认为不要用self.xxxxx来使用,因为使用存取器本来就是对外的,在内部使用可能会造成一些不必要的错误,比如:
self.array = [[NSArray alloc] init]; //内存泄露
这时就会造成内存泄露,因为[[NSArray alloc] init]生成NSArray对象之后赋值给self.array,由于array的存取方法中包含retain,这会使retainCount变成2,而实际应该是1,内存泄露且很难发现。
改成这样的写法也是苹果官方推荐的。
_array = [[NSArray alloc] init];
方法(Method)起名规则
一个规范的方法读起来应该像一句完整的话,读过之后便知函数的作用。执行性的方法应该以动词开头,小写字母开头,返回性的方法应该以返回的内容开头,但之前不要加get。
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
+ (id)arrayWithArray:(NSArray *)array;
如果有参数,函数名应该作为第一个参数的提示信息,若有多个参数,在参数前也应该有提示信息(一般不必加and)
一些经典的操作应该使用约定的动词,如initWith,insert,remove,replace,add等等。