读Effective objective-c 2.0
2018-01-05 本文已影响9人
Amy莫莫
第1条:oc起源
-
oc是给c添加面向对象特性,是其超集
-
oc使用动态绑定的消息结构,运行期所执行代码由运行环境决定,非编译器决定。函数调用由编译器决定。
-
oc指针用来指示对象。
NSString* someString=@"the string" 此变量为指向NSString的指针
-
对象所占内存分配在堆上,oc的内存管理是指对堆空间的内存管理。不带*号的变量,不是对象,保存在栈上(基本数据类型)。
CoreGraphics中的CGRect,CGRect是C结构体。 struct CGRect{ CGPoint origin; CGSize size; }; typedef struct CGRect CGRect;
第2条:在类的头文件中尽量少引入其他头文件
-
@class引用,避免循环引用
#import <Foundation/Foundation.h> @class EOCEmployer; @interface Employee : NSObject @property(nonatomic,copy)NSString *name; @property(nonatomic,strong)EOCEmployer *employer; @end
第3条:多用字面量语法,少用与之等价的方法
-
字面数值
//非字面量创建 NSNumber *num=[NSNumber numberWithInt:1]; //字面量创建 NSNumber *intNum=@1; NSNumber *boolNum=@YES; NSNumber *charNum=@'a'; int x=5; float y=5.67; NSNumber *totoalNum=@(x*y);
-
字面量数组
//非字面量 NSArray *array=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4", nil]; NSString *one=[array objectAtIndex:1]; //字面量 NSArray *array=@[@"1",@"2",@"3",@"4"]; NSString *one= array[1];
-
字面量字典
//非字面量 NSDictionary *person=[NSDictionary dictionaryWithObjectsAndKeys:@"Mat",@"name",[NSNumber numberWithInt:20],@"age", nil]; NSString *name=[person objectForKey:@"name"]; //字面量 NSDictionary *person=@{@"name":@"Mat",@"age":@28}; NSString *name=person[@"name"];
-
可变数组与字典
NSMutableArray *mutableArray=[array mutableCopy];
//非字面量
[mutableArray replaceObjectAtIndex:1 withObject:@"a"];
//字面量
mutableArray[1]=@"a";
NSMutableDictionary *mutableDic=[person mutableCopy];
//非字面量
[mutableDic setObject:@"MO" forKey:@"name"];
//字面量
mutableDic[@"name"]=@"MO";
第4条:多用类型常量,少用#define预处理指令
-
不要用#define定义常量,这样定义出来的常量不含类型信息。
-
使用static const 定义“只在编译单元内可见的常量”,此类常量不在全局符号表中,无需加前缀。
-
在头文件中使用extern来声明全局常量,需要加前缀。
static const NSTimeInterval kAnimationDuration=0.3; 在头文件中 extern NSString *const kAnimationDuration;
第5条:用枚举表示状态、选项、状态码
第6条:理解“属性”
- 点语法就是对存取方法的调用
- @dynamic关键字,告诉编译器不要自动创建实例变量和存取方法
- 特性:atomic(原子性)、nonatomic、readwrite、readonly、assign(纯量类型:基本数据类型、NSInteger、CGFloat等)、strong(拥有关系:保留新值,释放旧值,再设新值)、weak(非拥有关系:不设置新值、不释放旧值,对象释放就清空)、unsafe_unretained(语义与assign相同,适用于对象类型,非拥有关系,对象摧毁时,属性值不会自动清空)、copy、getter=<name>、setter=<name>
第7条:在对象内部尽量直接访问实例变量
- 直接访问实例变量会比点语法的速度快,因为不经过方法派发。
- 直接访问实例变量,不会调用其设置方法,绕过了内存管理。
- 直接访问实例变量,不会触发KVO。
- 通过属性访问有助于排查与之相关的错误,因为可以在存取方法里设置断点,监控属性的调用者和时机。
- 读取时用实例变量读,写入时用属性来写。
- 懒加载是在get方法里对对象进行初始化,必须用点语法访问属性。
第8条:理解“对象等同性”
- ==比较的是两个指针本身,并不是对象。NSObject用isEqual和hash方法判断两个对象是否相等。
- 相同的对象必须具有相同的hash码,但hash码相同的两个对象未必相同。
- hash是对象等同性的必要非充分条件,在NSSet和NSDictionary中判断时,会先判断hash值是否相等,如果相等,那么就会进行isEqual的判断;反之,不相等,直接判断对象不相等
第9条:以“类族模式”隐藏实现细节
- 类族模式可以把实现细节隐藏在一套公共接口后面