Protocol
应用范围: (blind structure communication):
作为方法参数以及属性使用
delegate
datasources
理解方向:
id -> introspection -> protocol语法规则:
@protocol end @optional @required
未标记为optional的方法必须实现支持父协议以及多协议.
写法为: protocols<xyz, NSObject>具体应用写法:
id<Foo> obj = [[MyClass alloc] init];
init 内对各个非optional方法进行实现.
Block
1.应用范围:
特别广.. 枚举,动画,排序,通知,错误处理,完成处理等等
- 理解方向:
其实就是闭包. - 语法规则:
(1). ^{}
(2). BOOL ^{ return value; }
(3) ^{return value;(类型要清晰可见就可以不加返回修饰) } - 特性:
(1). Block只会理解一个消息: copy. 即在堆中复制自己.
(2). Block默认读到的变量均为只读的.
(3). 想要得到非只读属性的变量, 就在变量类型前面加入__block
(4). 实例变量(instance variable. 带setter 和getter那种. 存储在堆heap中的)默认可读写.
(5). 凡是在block中使用的对象, 均为strong类型(保存在堆中),直到block结束.
(6). 易出现memory cycles. - 具体应用写法:
@property (nonatomic, strong) NSMutableArray * myBlocks;
[ self.myBlocks addObject: ^{
[self doSth];
} ];
// 读取
void (^doit)(void) = self.myBlocks[0];
doit();
- 特别注意.(避免内存循环 memory cycles)
内存循环会产生block无法从堆中释放的bug. 因为一直都在循环引用, 就无法释放.
解决方案:
使用局部变量时 可用__weak修饰符进行弱引用标识. 这样变量在作用于内完成的时候, 就可以自释放了.