Effective Objective-C 2.0读书笔记
1、所有Objective-C语言的对象都必须这样声明:
NSString *someString = @"the string";
它声明了一个名为somgString的变量,其类型是NSString。也就是说此变量为指向NSString的指针。所有对象所占内存总是分配在堆空间中,而绝不会分配在栈中。分配在堆中的内存必须直接管理。(现在是直接使用引用计数进行自动管理了。不需手动管理)而而那些定义中不含的变量分配在栈上的内存则会在其栈桢弹出时自动清理。
2、除非确有必要,否则不要引入头文件。一般来说应在某个类的头文件中使用前向声明@class
,并在实现文件中引入那些类的头文件。这样做可以尽量降低类之间的耦合。
3、有时无法使用向前声明,比如要声明某个类遵循一项协议。这种情况下,尽量把该类遵循某协议的声明移至分类中。如果不行的话就把协议单独放在一个头文件中,然后将其引入。
4、不要用预处理指令定义常量。这样定义出来的常量不含类型信息,编译器只是会在编译前据此执行查找于替换操作。即使有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中的常量不一致。在实现文件中使用static const
来定义只在编译单元内可见的常量:如static const NSTimeInterval kAnimationDuration = 0.5;
,在头文件中使用extern来声明全局常量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,通常用与之相关的类名做前缀。如:.h extern NSString *const EOCLoginNotification; .m NSString *const EOCLoginNotification = @"EOCLoginNotification";
5、ARC只负责管理Objective-C对象的内存。尤其要注意CoreFoundation
对象不归ARC管理,开发者必须适时调用CFRetain/CFRelease
。
6、在dealloc
方法中只释放引用并接除监听。
7、释放对象有两种方式:一种是调用release
方法,使其保留计数递减;另一种是调用autorelease
方法,将其加入自动释放池中,自动释放池用于存放那些需要在稍后某个时刻释放的对象。
8、选择与你公司、应用程序或者二者皆有关联之名称作为类名的前缀,并在所有代码中均使用这一前缀。