Objective-C 和 Cocoa 工程实践

StackOverflow 上有人问除了 HIG 外使用 Objective-C 以及 Cocoa 还有什么好的工程实践,果然是抛砖引玉,很多好的 practices 和 tips 一一跃然纸上,摘抄一些:

1> 使用 properties,不用 "_" 前缀。

2> 把 private 方法的定义移到 .m 文件,如下:

1
2
3
4
5
6
7
8
#import "MyClass.h"

@interface MyClass ()
- (void) someMethod
- (void) someOtherMethod
@end

@implementation MyClass

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
2
3
4
5
@interface MyClass :NSObject {
NSTextField *textField;
}
@property (nonatomic, retain) IBOutlet NSTextField *textField;
@end

8> 不要使用 id m_something 这样的命名来表明其为成员变量,用 something 或者 _something 替代。

9> 不要使用 -getSomething 还命名 getter,cocoa 惯例为 -something; 不要使用 -something 来命名 setter,cocoa 惯例为 -setSomething。

10> 命名中使用 CamelCase,不用下划线,类名称首字母大写,变量和方法首字母小写。

11> 使用 LLVM/Clang 做静态检查。

12> 不要使用未知 string 作为格式化 string,如下:

1
2
3
NSString *aString = // get a string from somewhere;
NSLog(aString);
NSLog(@"aString: %@", aString);

aString 有可能包含一些被认为是格式化的字符,这样传入 NSLog 可能会导致错误输出,crash 或者安全问题。应该像最后一行那样,直接输入格式化 string。

13> 不要使用 autorelease,使用 cocoa 命名惯例来标记需要调用者释放的资源。

1
2
3
4
5
6
7
8
9
10
11
12
- (MyClass *)convenienceMethod {
MyClass *instance = [[[self alloc] init] autorelease];
// configure instance
return instance;
}

// instead
- (MyClass *)newInstance {
MyClass *instance = [[self alloc] init];
// configure instance
return instance;
}

14> dealloc 中不要忘了重置 delegate:

1
2
3
4
5
6
- (void)dealloc
{
self.someObject.delegate = NULL;
self.someObject = NULL;
[super dealloc];
}

15> 单元测试。

16> 不要像 Java/C#/C++… 那样来写 Objective-C。

17> 不要无节制的使用 category,这样在 port 过程中你会得到好处。

详细列表请点击