Objective-C 和 Cocoa 工程实践
StackOverflow 上有人问除了 HIG 外使用 Objective-C 以及 Cocoa 还有什么好的工程实践,果然是抛砖引玉,很多好的 practices 和 tips 一一跃然纸上,摘抄一些:
1> 使用 properties,不用 "_" 前缀。
2> 把 private 方法的定义移到 .m 文件,如下:
1 |
|
Objective-C 的方法没有像 Java 那样的 private 或者 public 属性,如果需要设置方法为 private,一般采用 category 来对方法进行隐藏。
如果外界根本就不关心私有方法,那何必要放在 .h 里呢。
3> 把 dealloc 方法移到 .m 文件的最前面,@synthesize 下面。这样到底什么该 dealloc 一目了然。
4> 不用使用 double 类型,iPhone 原生不支持任何 double 精度的计算。
5> 不用多线程时将 properties 设置为 nonatomic,synthesize 缺省是 atomic 的,运行时会添加semaphore 代码来进行线程互斥,nonatomic 效率上会好点。
6> SQLite 处理大数据集非常快,但瓶颈往往出现在磁盘 I/O,不要频繁的 commit 小数据,使用 BEGIN; 和 COMMIT; 来组装 transaction,确保大块的进行数据写入。
如果查询操作非常耗时,SQL 可能会阻塞 GUI,最好使用单独来处理 SQL 操作。
7> 出于历史原因,Outlet 的内存管理很差,最好声明 outlets 为 properties:
1 | @interface MyClass :NSObject { |
8> 不要使用 id m_something 这样的命名来表明其为成员变量,用 something 或者 _something 替代。
9> 不要使用 -getSomething 还命名 getter,cocoa 惯例为 -something; 不要使用 -something 来命名 setter,cocoa 惯例为 -setSomething。
10> 命名中使用 CamelCase,不用下划线,类名称首字母大写,变量和方法首字母小写。
11> 使用 LLVM/Clang 做静态检查。
12> 不要使用未知 string 作为格式化 string,如下:
1 | NSString *aString = // get a string from somewhere; |
aString 有可能包含一些被认为是格式化的字符,这样传入 NSLog 可能会导致错误输出,crash 或者安全问题。应该像最后一行那样,直接输入格式化 string。
13> 不要使用 autorelease,使用 cocoa 命名惯例来标记需要调用者释放的资源。
1 | - (MyClass *)convenienceMethod { |
14> dealloc 中不要忘了重置 delegate:
1 | - (void)dealloc |
15> 单元测试。
16> 不要像 Java/C#/C++… 那样来写 Objective-C。
17> 不要无节制的使用 category,这样在 port 过程中你会得到好处。
详细列表请点击