update6 Protocol 以及Block

Protocol

  1. 应用范围: (blind structure communication):

  2. 作为方法参数以及属性使用

  3. delegate

  4. datasources

  5. 理解方向:
    id -> introspection -> protocol

  6. 语法规则:
    @protocol end @optional @required
    未标记为optional的方法必须实现

  7. 支持父协议以及多协议.
    写法为: protocols

  8. 具体应用写法:
    id obj = [[MyClass alloc] init];
    init 内对各个非optional方法进行实现.

Block

1.应用范围:
特别广.. 枚举,动画,排序,通知,错误处理,完成处理等等

  1. 理解方向:
    其实就是闭包.
  2. 语法规则:
    (1). ^{}
    (2). BOOL ^{ return value; }
    (3) ^{return value;(类型要清晰可见就可以不加返回修饰) }
  3. 特性:
    (1). Block只会理解一个消息: copy. 即在堆中复制自己.
    (2). Block默认读到的变量均为只读的.
    (3). 想要得到非只读属性的变量, 就在变量类型前面加入__block
    (4). 实例变量(instance variable. 带setter 和getter那种. 存储在堆heap中的)默认可读写.
    (5). 凡是在block中使用的对象, 均为strong类型(保存在堆中),直到block结束.
    (6). 易出现memory cycles.
  4. 具体应用写法:
 @property (nonatomic, strong) NSMutableArray * myBlocks;
[ self.myBlocks addObject: ^{
 [self doSth];
} ];


// 读取
void (^doit)(void) = self.myBlocks[0];
doit();
  1. 特别注意.(避免内存循环 memory cycles)
    内存循环会产生block无法从堆中释放的bug. 因为一直都在循环引用, 就无法释放.
    解决方案:
    使用局部变量时 可用__weak修饰符进行弱引用标识. 这样变量在作用于内完成的时候, 就可以自释放了.

你可能感兴趣的:(update6 Protocol 以及Block)