iOS 开发文档规范
-
Method 命名
驼峰
类前缀使用三个字符,避开2个字符的NS,UI,CG,CF,CA,WK,MK,CI,NC
一个执行动作以动词开头。
- (void)invokeWithTarget:(id)target直接返回内容不需要加get。间接返回内容,才需要加get。比如通过传入指针,func将操作指针改变内存存储的值,多个值返回的时候使用get
如果子类的方法比父类更明确。更有针对性。不应该重写类本身提供的方法,应该添加一个新的方法
-
Accessor命名规范
- 可以使用will,should,can 明确方法意义,但是不要使用do,does这类无意义的情态动词。
- delegate 方法除非只有一个参数,否则冒号加到类名后面
-
Initlalize 规范
- initialize类方法先于其他的方法调用。且initialize方法给我们提供了一个让代码once、lazy的地方。initialize通常被用于设置class的版本号。initialize方法的调用遵循继承规则(所谓继承规则,简单来讲是指:子类方法中可以调用到父类的同名方法,即使没有调用[super xxx])。如果我们没有实现initialize方法,运行时初次调用这个类的时候,系统会沿着继承链(类继承体系),先后给继承链上游中的每个超类发送一条initialize消息,直到某个超类实现了initlialize方法,才会停止向上调用。某个类的initialize方法可能会被调用多次
- 如果超类的某个初始化方法不适合于子类,子类覆写这个超类的方法,并在其抛出异常。
- 不要在子类的初始化方法中调用父类的secondary初始化方法。否则容易陷入方法调用死循环
- 禁止在子类中使用self 访问属性
-
dealloc规范
- 不要忘记在dealloc方法中移除通知和KVO
- dealloc应该放在文件的最上面,并且刚好在 @synthesize 和 @dynamic 语句的后面。在任何类中,init 都应该直接放在 dealloc 方法的下面。
- 在dealloc方法中,禁止将self作为参数传递出去,如果self被retain住,到下一个runloop在释放,会造成多次crash.
-(void)dealloc{
[self unsafeMethod:self];
// 因为当前已经在self这个指针所指向的对象的销毁阶段,销毁self所指向的对象已经在所难免。如果在unsafeMethod:中把self放到了autorelease poll中,那么self会被retain住,计划下个runloop周期在进行销毁。但是dealloc运行结束后,self所指向的对象的内存空间就直接被回收了,但是self这个指针还没有销毁(即没有被置为nil),导致self变成了一个名副其实的野指针。
// 到了下一个runloop周期,因为self所指向的对象已经被销毁,会因为非法访问而造成crash问题。
}
-
block使用
- block使用时必须对block判空
- 注意block潜在的引用循环
如果想获取window,不要使用view.window获取,请使用[[UIApplication sharedApplication] keyWindow]
在使用到 UIScrollView,UITableView,UICollectionView 的 Class 中,需要在 dealloc 方法里手动的把对应的 delegate, dataSouce 置为 nil。
一些经常被使用的文件建议做好缓存。避免重复的IO操作。建议只有在合适的时候再进行持久化操作。
不要使用可能为nil的对象,对集合进行初始化。初始化之前对象要进行判空处理。否则会出现crash。
禁止在多线程环境下直接访问可变集合对象中的元素。应该先对其进行copy,然后访问不可变集合对象内的元素
block中的return的作用域。block中的return代表的是使当前的block返回,而非使当前的整个函数体返回
-
懒加载的适用场景
- 一个对象的创建依赖于其他对象。
- 项目中使用或者不用
- 伴随着大量的计算或者性能消耗
-
多线程规范
- 禁止使用GCD的dispatch_get_current_queue()函数获取当前线程信息。
- 剪切板的读取必要时候放在异步线程处理。
- 仅当必须保证顺序的时候采用dispatch_sync,否则容易出现死锁,应避免应用使用dispatch_async。
-
内存管理规范
- 除非知道自己做什么,否则不建议将UIView类的对象加入到NSArray、NSDictionary、NSSet中。如有需要可以添加到NSMapTable 和 NSHashTable
-
延迟调用规范。
【必须】performSelector:withObject:afterDelay:要在有Runloop的线程里调用,否则调用无法生效。说明:异步线程默认是没有runloop的,除非手动创建;而主线程是系统会自动创建Runloop的。所以在异步线程调用是请先确保该线程是有Runloop的。
.h尽量不要暴露属性。属性暴露只读的,.h文件中只暴露出一些必要的类、公开的方法、只读属性;私有类、私有方法和私有属性以及成员变量,尽量写在.m文件中