zoukankan      html  css  js  c++  java
  • OC学习4——OC新特性之块(Block)

    文章主要参考  关于OC中的block自己的一些理解(一)

    对块的深入理解  浅析ios开发中Block块语法的妙用

    1、关于block

    block的作用:保存一段代码。

    苹果官方推荐的一种语法,类似于C语言的函数,但是比函数更加灵活。

    ^是block语法的标识

    2、在Object-C中,块被当做一个对象来处理,这个对象可以: 

    有自己的局部变量

    可以传入参数

    有返回值

    可以访问自己定义时的上下文变量

    可以修改自己定义时特定的上下文变量

    作为参数传递给其它函数

    3、block的基本语法

    4、block的使用

    1. 无返回值无参数
       1 - (void)myFirstBlock
       2 {
       3     //1.定义block
       4     void (^myblock)() = ^{  NSLog(@"无参数无返回值");  };
       5     
       6     //2.调用block
       7     myblock();    
       8 }
       9 
      10 //输出结果:2016-02-18 09:56:50.124 01-block[750:25107] 无参数无返回值
    2. 有参数没有返回值

       1 - (void)mySecondBlock
       2 {
       3     //1.定义block
       4     void (^mySecondBlock)(int,int) = ^ (int num1,int num2){
       5         NSLog(@"有参数无返回值:%d",num1 + num2);
       6     };
       7    
       8     //2.调用block
       9     mySecondBlock(2,3);
      10 }
      11 
      12 //输出结果:2016-02-18 10:03:22.221 01-block[811:30160] 有参数无返回值:5
    3. 有参数有返回值
       1 - (void)myThirdBlock
       2 {
       3     //1.定义block
       4     double (^myThirdBlock)(double,double) = ^ (double r1,double r2){
       5         return r1 + r2;
       6     };
       7     
       8      //2.调用block
       9      double r3 = myThirdBlock(1.1,2.2);
      10      NSLog(@"有参数有返回值:%f",r3);
      11 }
      12 
      13 //输出结果:2016-02-18 10:06:42.615 01-block[861:32505] 有参数有返回值:3.300000

    5、block的注意点

    1. Block内部可以访问外部变量
    2. 默认情况下,Block内部不能修改外部的局部变量
    3. 给局部变量加上 _block 关键字,则这个局部变量可以在block内部进行修改
       1 - (void)myFourBlock
       2 {
       3     //int num = 5;
       4     __block int num = 5;
       5     void (^myFourBlock)() = ^{
       6     
       7         num = 6;
       8         NSLog(@"%d",num);
       9     };
      10     myFourBlock();
      11 }

       上述代码中如果num的定义才用第3行的方式,则在运行第六行时会报错:missing __block type specifier; ,才用第4行的定义则可以正确输出:2016-02-18 10:25:02.195 01-block[1016:45943] 6

    6、整体应用代码

     1 #import <Foundation/Foundation.h>
     2 
     3 typedef int (^MyBlock)(int,int); // block类型
     4 
     5 int cc =9 ;
     6 int main(int argc, const char * argv[]) {
     7     
     8     int a = 20 ;
     9     __block int b = 100 ;
    10     void (^voidBlock)() = ^{
    11         NSLog(@"------------");
    12         //在bloc体内不能修改非__block声明的局部变量,可以修改全局变量和用__block声明的局部变量
    13         //a = 10;
    14         b = 50 ;
    15         cc = 111;
    16     };
    17     NSLog(@"%d %d %d",a,b,cc);
    18     voidBlock();
    19     NSLog(@"%d %d %d",a,b,cc);
    20     
    21     
    22     
    23     
    24     int (^sumBloc)(int , int);
    25     sumBloc= ^(int a,int b){
    26         
    27         return a+b;
    28     };
    29     int (^subBloc)(int,int) = ^(int a,int b){
    30         return a - b ;
    31     };
    32     
    33     int sum = sumBloc(10,90);
    34     int sub = subBloc(10,90);
    35     
    36     NSLog(@"sum = %d sub = %d",sum,sub);
    37     
    38     voidBlock();
    39     
    40     
    41     //------ typedef block类型用法------------
    42     
    43     MyBlock sum1 = ^(int a,int b){
    44         return a + b ;
    45     };
    46     
    47     MyBlock sub1 ;
    48     sub1 = ^(int a ,int b){
    49         return a - b ;
    50     };
    51     
    52     NSLog(@"sum1 = %d sub1 = %d",sum1(10,20),sub1(20,10));
    53     
    54     return 0;
    55 }
  • 相关阅读:
    pip 更新下载源
    Image-match
    Laravel之事务与锁
    Laravel之vue操作
    html 固定居中
    vue状态管理(vuex)
    vue兄弟组件的相互通讯(vuex方式)
    vue兄弟组件之间的通信(bus.js)方法
    webapi使用过滤器拦截客户端传来的参数
    webapi跨域,服务器上使用session
  • 原文地址:https://www.cnblogs.com/mukekeheart/p/7337491.html
Copyright © 2011-2022 走看看