zoukankan      html  css  js  c++  java
  • blcok,sel学习小结

        iOS开发中,经常会用到两种特殊的数据类型,block和sel,小弟就暂且把这两种数据类型做下总结:

      

    1. SEL是一种数据类型,代表方法签名,通过SEL数据类型就能找到这个对象上的某个方法。

    SEL sel = @selector(方法名);

    使用场景:

    (1)作为方法的实参、形参

    (2)作为方法的返回值(不常用)

     1.测试某个方法是否能响应一个方法:

    BOOL is = [dog respondsToSelector:@selector(show)];

    注释:利用方法respondsToSelector(参数是SEL类型变量)测试dog对象是否能响应show这个方法,返回值是一个BOOL类型的变量。

    2.方法performSelector:(SEL)withObject:(id)  可以带参数,最多带两个参数,也可以不带参数。

    作用:执行某个方法。

    2. block:代码块

     是一种数据类型,作用是封装代码。与函数的区别是,函数不能定义在方法或者是函数内部,但是block可以。block的用法同函数类似,可以有返回值,也可以没有返回值,可以带参数,也可以不带参数。

    void (^ 名字)(参数列表) =  ^返回值类型 (参数列表){代码};

    注意:

    1、当block内部使用对象的时候,block内部就会有对对象的一个强引用,可能会有一个循环引用的问题,处理不当的话会造成内存泄漏

     其它普通对象一般没什么,如果是外部对象而且已经有了一个强引用的情况,需要特殊注意。尤其是self对象

    屏幕快照 2016-01-21 下午12.01.56.png

     2.block的用处,block 一般用来传值的。(代理:一般封装控件的时候使用代理,为了代码的扩张性。)

     用法:(1)作为回调方法,当作参数放在方法里面。

    block做参数的格式:

    (void (^)( id responseObject))success : 代码块作为方法的参数的时候的格式

     代码块做参数使用,代码块数据的定义一般在参数里面实现

     (void (^)( id responseObject)):表示代码块数据类型(跟int等等一样)

     success:数据类型名字

     只有将代码块放到方法里面做参数的时候才会使用上面的格式

     在调用这个方法的时候就在方法里面把代码块实现。

    基本使用:

        //方式1:声明和定义放到一起

        void(^myblock)(NSString *x) = ^(NSString *str){

            NSLog(@"%@",str);

        };

        

        //调用

        myblock(@"456");

        //方式2

        void(^myblock)(NSString *x);

        myblock = ^(NSString *x){

            NSLog(@"%@",x);

        };

         //调用

        myblock(@"haobang");

    其实block 和 方式,函数是类似的,只不过block是一种数据类型而已。在声明和定义的时候只需要指定一个参数,并且制定参数的类型。具体的参数是什么都是在调用的时候赋值的。

    传值:代码块主要是用来做传值的,如AFN框架的post,get方法

      传值的条件:

    1. 接收方必须有一个属性接收

    2. 确定什么时候传

    总的来说就是一句话:传值的目标类实现具体代码块怎样做,然后在原始类调用代码块代码加上参数,就把参数传递过去了。

    block使用注意点:  block要想保存到模型里面,在mrc中一般使用copy修饰符,因为在mrc中只有copy才会把block放在堆内存中,arc中可以使用strong,copy,目的都是把block放在堆内存中。

  • 相关阅读:
    Chrome浏览器的下拉选择框option有黑框的问题
    修改input checkbox和radio默认样式
    VsCode安装cssrem插件实现px转rem
    js实现小球的弹性碰撞
    CSS 技巧 -- 不定宽溢出文本适配滚动
    记忆化递归和递推
    DOM事件中target和currentTarget的区别
    TypeScripy + Vue Property Decorator + Vue Router,组件内的导航守卫无效
    行内元素没有内容时设置默认的宽高
    焦点元素,添加半透明遮罩
  • 原文地址:https://www.cnblogs.com/xiaofei993/p/5314374.html
Copyright © 2011-2022 走看看