1、分类
使用
- 声明私有方法
- 分解体积庞大的类文件
- 把Framework私有方法公开
特点
- 运行时决议
- 可以为系统类添加分类
添加内容
- 实例方法
- 类方法
- 协议
- 属性
2、关联对象
通过关联对象为分类添加“成员变量”
id objc_getAssociatedObject(id object, const void *key)
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
void objc_removeAssociatedObjects(id object)
关联对象有AssociationsManager管理并在AssociationsHashMap存储
3、扩展(Extension)
使用
- 声明私有属性
- 声明私有方法
- 声明私有成员变量
特点
- 编译时决议
- 只以声明形式存在,多数情况下寄生于宿主类的.m中
- 不能为系统类添加扩展
4、代理(delegate)
5、通知(NSNotification)
- 使用观察者模式实现跨层消息传递
- 一对多
6、KVO
- Key-value observing
- 观察者模式
- 使用isa-swizzling实现 (面向切面编程的Aspects)
- (void)willChangeValueForKey:(NSString *)key;
...
- (void)didChangeValueForKey:(NSString *)key;
7、KVC
Key-value coding
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
8、属性关键字
- 读写权限 (readonly / readwrite(默认))
- 原子性 (atomic(默认) / nonatomic)
- 引用计数 (retain / strong(默认) assign(默认) / unsafe_unretained(MRC) weak)
assign / weak
assign
- 修饰基本数据类型
- 修饰对象类型,不改变其引用计数
- 会产生悬垂指针
weak
- 不改变修饰对象的引用计数
- 所指对象被释放后指针置为nil
copy
retain
MRC下重写retain修饰变量的setter方法
@property (nonatomic, retain) id obj;
- (void)setObj:(id)obj {
if (_obj != obj) {
[_obj release];
_obj = [obj retain];
}
}