美文网首页
update6 Protocol 以及Block

update6 Protocol 以及Block

作者: 冰风47 | 来源:发表于2016-07-18 11:55 被阅读10次

    Protocol

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

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

    3. delegate

    4. datasources

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

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

    7. 支持父协议以及多协议.
      写法为: protocols<xyz, NSObject>

    8. 具体应用写法:
      id<Foo> 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

          本文链接:https://www.haomeiwen.com/subject/flvpjttx.html