美文网首页iOS基础·OC高级篇
iOS开发--block、protocol(协议)

iOS开发--block、protocol(协议)

作者: 元宇宙协会 | 来源:发表于2016-03-21 22:51 被阅读286次

    其实block是苹果官方强烈推荐,比代理好使。
    那么我们要定义block怎么做?

    1、简单定义block
    (1)有形参

    int (^myBlock)(int, int);
    

    (2)无形参

    // 没有形参的无返回值block
    void (^myBlock)();
    

    2、利用block封装一段代码
    (1)有形参

    ^(int a, int b){
      return a + b;
    }
    

    (2)无形参

    ^(){
      NSLog(@"------");
    }
    

    (3)无形参可以省略括号

    ^{
      NSLog(@"------");
    }
    

    3、如何在block中访问外部变量

    int a = 20;
    __block int b = 100;
    
    // 定义一个block
    void (^myBlock)();
    
    // 封装一段代码
    myBlock = ^{
      // 默认情况下可以访问外面变量的值,但是无法改变a的值
      
      // 如果想要改变外面的变量值,可以在变量前加上__block
      b = 20;
    }
    
    // 执行block
    myBlock();
    

    4、可以使用typedef定义block

    //有时候频繁使用block可以使用typedef来定义block
    typedef int (^myBlock)(int a, int b);
    
    // 利用类型,定义
    myBlock block;
    myBlock b1, b2; 
    
    // 可以利用类型直接赋值
    b1 = ^(int a, int b){
         return a + b;
    };
    
    myBlock b3 = ^(int a, int b){
        return a * b;
    };
    
    protocol<协议>

    用来声明一大堆方法(不能声明成员变量)
    只要某个类遵守了这个协议,那么就拥有这个协议中的所有方法
    只要父类遵守了某个协议,相当于子类也遵守了。
    协议只有一.h文件,分类是有.h和.m文件

    协议格式
    
    @protocol 协议名称 <NSObject>
    - (void)test;
    @end
    
    某个类遵守协议
           // 继承 :  // 遵守协议<>
    @interface 类名 :父类 <协议名称>
    @end
    
    协议中的几个关键字
    // 如果什么都不选,那么默认是@required,必须实现
     @required // 必须实现
     @optional // 可选的,不要求实现
    
    基协议

    NSObject是最基本的类,任何其他类都要继承它
    <NSObject>是基协议,它中声明了很多方法,比如retain/release/description,
    每一个新的协议都要遵守NSObject这个基协议

    以后写一份协议,一定要遵守<NSObject>
    变量保存对象遵守协议

    定义一个变量,限制这个变量保存的对象也遵守某个协议
    类名<协议名称> *变量名
    SYCar <MyProtocol> *obj;
    id<协议名称> 变量名
    id <MyProtocol> oc;

    声明属性遵守协议

    在@property中声明属性也可以遵守协议来限制

    @property (nonatomic, strong) 类名<协议名称>*属性名
    
    @property (nonatomic, strong) Car <MyProtocol> *car
    
    @property (nonatomic, strong) id <MyProtocol> car2;
    
    

    开发注意点:
    如果一个协议,只有一个类去遵守的话,写在类声明文件即可
    如果一个协议,有多个类去遵守,那么写在外面。

    分类也可以定义在单独的.h.m文件,也可以定义在原来类中。
    1>一般情况下都是定义在单独文件(开发一般就是常用这种)
    2>定义在原来类中的分类。

    协议代理设计

    我们通过代理可以达到一些自己无法处理的事情。

    Paste_Image.png Paste_Image.png Paste_Image.png

    代理中执行方法:


    Paste_Image.png

    一定要注意耦合性
    所以代理必须要有协议,只有通过遵守协议,实现协议中的方法达到解决耦合性这个问题

    1、生成代理协议


    Paste_Image.png

    2、谁成为代理谁遵守协议


    Paste_Image.png

    3、实现代理协议方法


    Paste_Image.png

    4、顺利解耦


    Paste_Image.png

    5、

    相关文章

      网友评论

        本文标题:iOS开发--block、protocol(协议)

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