tected 前缀。
按苹果的说法,不建议在除了 init?和 dealloc?方法以外的地方直接访问实例变量,但很多人认为直接访问会让代码更加清晰可读,只在需要计算或者执行操作的时候才使用存取方法访问,我就是这种习惯,所以这里不作要求。
?
命名常量( Constants?)?
如果要定义一组相关的常量,尽量使用枚举类型( enumerations ),枚举类型的命名规则和函数的命名规则相同:
使用匿名枚举定义 bit map :
使用 const 定义浮点型或者单个的整数型常量,如果要定义一组相关的整数常量,应该优先使用枚举。常量的命名规范和函数相同:
不要使用 #define 宏来定义常量,如果是整型常量,尽量使用枚举,浮点型常量,使用 const 定义。 #define 通常用来给编译器决定是否编译某块代码,比如常用的:
注意到一般由编译器定义的宏会在前后都有一个 __ ,比如?__MACH__?。
?
命名通知( Notifications?)?
通知常用于在模块间传递消息,所以通知要尽可能地表示出发生的事件,通知的命名范式是:
栗子:

注释?
读没有注释代码的痛苦你我都体会过,好的注释不仅能让人轻松读懂你的程序,还能提升代码的逼格。注意注释是为了让别人看懂,而不是仅仅你自己。
每一个文件都?必须?写文件注释,文件注释通常包含?
一段良好文件注释的栗子:
文件注释的格式通常不作要求,能清晰易读就可以了,但在整个工程中风格要统一。
好的代码应该是 “ 自解释 ” ( self-documenting )的,但仍然需要详细的注释来说明参数的意义、返回值、功能以及可能的副作用。
方法、函数、类、协议、类别的定义都需要注释,推荐采用 Apple 的标准注释风格,好处是可以在引用的地方 alt+ 点击自动弹出注释,非常方便。
有很多可以自动生成注释格式的插件,推荐使用?VVDocumenter?:?
![1430987627931187.gif]()
一些良好的注释:

协议、委托的注释要明确说明其被触发的条件:
如果在注释中要引用参数名或者方法函数名,使用 || 将参数或者方法括起来以避免歧义:
每个人都有自己的编码风格,这里总结了一些比较好的 Cocoa 编程风格和注意点。
?
不要使用 new?方法?
尽管很多时候能用 new 代替 alloc init 方法,但这可能会导致调试内存时出现不可预料的问题。 Cocoa 的规范就是使用 alloc init 方法,使用 new 会让一些读者困惑。
?
Public API?要尽量简洁?
共有接口要设计的简洁,满足核心的功能需求就可以了。不要设计很少会被用到,但是参数极其复杂的 API 。如果要定义复杂的方法,使用类别或者类扩展。
#import和 #include?
#import 是 Cocoa 中常用的引用头文件的方式,它能自动防止重复引用文件,什么时候使用 #import ,什么时候使用 #include 呢?
栗子:
为什么不全部使用 #import 呢?主要是为了保证代码在不同平台间共享时不出现问题。
上面提到过,每一个框架都会有一个和框架同名的头文件,它包含了框架内接口的所有引用,在使用框架的时候,应该直接引用这个根头文件,而不是其它子模块的头文件,即使是你只用到了其中的一小部分,编译器会自动完成优化的。
BOOL?的使用?
BOOL 在 Objective-C 中被定义为 signed char 类型,这意味着一个 BOOL 类型的变量不仅仅可以表示 YES(1) 和 NO(0) 两个值,所以永远?不要?将 BOOL 类型变量直接和 YES 比较:?
同样的,也不要将其它类型的值作为 BOOL 来返回,这种情况下, BOOL 变量只会取值的最后一个字节来赋值,这样很可能会取到 0 ( NO )。但是,一些逻辑操作符比如 &&,||,! 的返回是可以直接赋给 BOOL 的:
另外 BOOL 类型可以和 _Bool,bool 相互转化,但是?不能?和 Boolean 转化。?
除非想要兼容一些古董级的机器和操作系统,我们没有理由放弃使用 ARC 。在最新版的 Xcode(6.2) 中, ARC 是自动打开的,所以直接使用就好了。
?
在 init?和 dealloc?中不要用存取方法访问实例变量?
当 initdealloc 方法被执行时,类的运行时环境不是处于正常状态的,使用存取方法访问变量可能会导致不可预料的结果,因此应当在这两个方法内直接访问实例变量。
按照定义的顺序释放资源?
在类或者 Controller 的生命周期结束时,往往需要做一些扫尾工作,比如释放资源,停止线程等,这些扫尾工作的释放顺序应当与它们的初始化或者定义的顺序保持一致。这样做是为了方便调试时寻找错误,也能防止遗漏。
?
保证 NSString?在赋值时被复制?
NSString 非常常用,在它被传递或者赋值时应当保证是以复制( copy )的方式进行的,这样可以防止在不知情的情况下 String 的值被其它对象修改。
使用带有 @ 符号的语法糖来生成 NSNumber 对象能使代码更简洁:
nil?检查?
因为在 Objective-C 中向 nil 对象发送命令是不会抛出异常或者导致崩溃的,只是完全的 “ 什么都不干 ” ,所以,只在程序中使用 nil 来做逻辑上的检查。
另外,不要使用诸如 nil == Object 或者 Object == nil 的形式来判断。
属性的线程安全?
定义一个属性时,编译器会自动生成线程安全的存取方法( Atomic ),但这样会大大降低性能,特别是对于那些需要频繁存取的属性来说,是极大的浪费。所以如果定义的属性不需要线程保护,记得手动添加属性关键字 nonatomic 来取消编译器的优化。
不要用点分语法来调用方法,只用来访问属性。这样是为了防止代码可读性问题。
Delegate?要使用弱引用?
一个类的 Delegate 对象通常还引用着类本身,这样很容易造成引用循环的问题,所以类的 Delegate 属性要设置为弱引用。
?