zoukankan      html  css  js  c++  java
  • QF——OC中的SEL类型和Block

    @selector():

      可以理解@selector()就是取类方法的编号,他的基本行为类似于C语言中的函数指针(指向函数的指针)。它们通过传递方法的地址(或编号)来实现把方法当做参数的效果。

      不过在C语言中,可以直接把一个函数名赋给一个函数指针,但是在OC中不行,而是要通过@selector语法来取。它的括号里传入的是方法名,返回结果是SEL类型,该类型本质上就是方法的编号(地址)。

      OC中可以通过SEL类型(即方法编号)来动态的调用方法。其实OC中调用方法的本质是消息传递:系统给对象发送执行动作的消息。程序被编译器编译后会被解释为C的消息的发送objc_msgSend(receviver,selector,args...);

      第一个参数为消息的接收者,也就是OC中调用方法的对象;第二个参数为消息,也对应OC中的方法编号,后面的参数是方法里的参数。它运行的本质是会在receviver这个对象的isa指针指向的“类对象”(class object)中遍历有无@selector()里方法,若有就调用,若无就在父类中继续寻找。

     

    block:

      block,名为代码块。它和函数很相似,有返回值,有名称,有参数列表。

    格式:

    返回值类型 (^代码块名)(参数类型列表) = ^(参数列表){  代码实现...  }; 

    注意:花括号后面分号结尾。

      

      

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

    int result = Myblcok(3, 4);

    但是在实际需求中一般省略等号左边的声明,而只写等号右边的部分 ^(int a,int b){   return a+b   };

    可以看出,它和C中的函数指针及其相似 int  (* Myfunction)  (int a, int b)

    需要注意的是:block默认情况下是不能访问block外部的局部变量的。原因是定义block后,block会对当前的局部变量进行一份拷贝,也就是说在block里操作的局部变量已经是另外一个temp变量,所以原局部变量是没有反应的。除非在声明局部变量的时候加上__block关键字。(两个短下划线)

     block初始化时是在栈上的。

  • 相关阅读:
    微软系统及开发工具官方下载地址
    Office2010文档的MIME类型
    Android开发中Activity的生命周期
    DWZ框架POST方式提交Form提示JSON文件下载
    JAVA开发环境搭建
    FastJSON解析.Net生成的JSON字符串
    SQL Server 2008 如何更改服务器身份验证模式
    如何快速解决IIS中发布的网站不能访问。
    QlickView
    Lamabda表达式
  • 原文地址:https://www.cnblogs.com/wangerxiansheng/p/4339695.html
Copyright © 2011-2022 走看看