原创,欢迎转载收藏,请标明原文地址。
代码写的不够漂亮工整符合规范?大家的代码风格过于迥异阅读困难?
作为一个程序猿来说我越来越感觉到养成一个良好的代码风格的重要性,总结一下OC编程中的一些代码规范(苹果官方推荐的)。
参考资料:IOS Developer Library 对建议的代码规范的说明 ,我也发现有同学翻译成中文版本了。
类(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等等。