编写高质量iOS与OS X代码的52个有效方法
第一章重点:
第一条:OC的起源
- OC由smalltalk语言演化而来的语言为消息结构(messaging structure)语言,其运行时所因执行的的代码由运行环境来决定;函数调用(function calling)语言(Java,C++)则由编译器决定。
- 分配在堆中的内存必须直接管理,而分配在栈中的内存用于保存变量的内存则会在其栈帧中弹出时自动清理掉。
- OC将堆内存管理抽象出来。不需要malloc和free来分配或释放对象所占的内存,这一套抽象管理框架叫:引用计数。
- 与预创建结构体相比,创建对象需要额外的开销,例如分配及释放堆内存等。
- OC为C添加了面向对象特性,是其的超集。OC使用动态绑定的消息结构,在运行时才会检查对象类型,接收到一条消息后,究竟应该执行何种代码由运行环境而非编译器来决定。
第二条:在内的头文件中尽量少引入其他有文件
- 除非必要,否则使用@class的方式向前声明体积别的类,并在实现文件中引入那些类的头文件,这样可以尽量降低类之间的耦合(话说没几个人这么做吧)。
- 在无法使用@class进行向前声明时,比如要声明某个类遵循的协议,这种情况下,尽量在这条声明放在“class-continuation分类”中,再不行就将协议单独放在一个头文件中。
第三条:多使用字面字面量语法(语法糖),少用与之等价的方法。
eg: NString *str = @"test"; 而不是:[NSString stringwhith.....];
NSNumber *nb = @2; 而不是:[NSnumber numberWith.....];
NSArray *arr = [obj,obj,obj],而不是[NSArray arrayWhith.....];
- 尽量使用字面量语法创建字符串、数值、字典、数组。与创建此类对象的常规方法,字面量方法创建简明扼要。
- 已通过下标操作来访问数组或,通过key访问字典中对应的value。
- 用字面量创建数组或字典时,若值中有nil,则会抛出异常,引起字面量方法处理数组时,务必保证数组里面的值不为nil。
第四条:多用类型产量,少用#define预处理指令
- 不要用预处理指令定义产量,这样定义出来的常量不含类型信息,编译器知识在编译器只是在编译前据此执行查找与替换操作。即使是有人重新定义常量值,编译器也不会产生警告信息,这将导致应用程序的常量值不一致(这个好像大部分人都不是这样做的)。
- 在实现文件中使用 static const来定义“只在编译单元内可见的产量(translation-unit-specific constant)。由于此产量不在全局符号中,所以无需为名称加前缀。
- 在有文件中使用extern来声明全局变量,并在相关实现文件中定义其值。这种产量要出现在全局符号表中,所以其名称应加以区分,通常与之相关的类名做前缀。
#import <UIKit/UIKit.h> @interface ViewController : UIViewController extern NSString *const DemoStringConstant; @end #import "ViewController.h" @interface ViewController () @end static const NSTimeInterval kAnimationDuration = 0.3; NSString *const DemoStringConstant = @"MLCAnimatedViewExtenConstantString"; @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [UIView animateWithDuration:kAnimationDuration animations:^{ }]; NSLog(DemoStringConstant); }
第五条:用枚举表示状态、选项、状态码