OC中block知识点使用方法

block

作用

  • block用来保存一段代码
  • block标志 ^
  • 跟函数很像
    • 1.可以保存代码
    • 2.有返回值
    • 3.有形参
    • 4.调用方式一样
  • 无返回值无参数
    //定义block变量
    void (^myblock)() = ^ {
      //没有形参可以省略后面的()
        NSLog(@"----");
    };
    
     //利用block调用block内部的代码
    myblock();
  • 有返回值有参数
    int (^sumblock)(int, int) = ^(int a, int b) {
        return a + b;
    };
    
    int c = sumblock(10,11);
    
    NSLog(@"%d",c);
    

block的重定义

  • 我们先看一段关于typedef重定义函数指针的
定义一个两数之和的函数
int sum(int a, int b) {
    return a + b;
}

定义两个函数指针指向sum
    int (*p1)(int, int) = sum;
    int (*p2)(int, int) = sum;
    
因为代码过多重复我们可以typedef重定义一个函数指针类型

typedef int (*SumP)(int, int);   
//ps:重定义函数指针 (*SumP)中SumP就是类型名

以后我们就可以这样定义两个函数指针

    SumP p3 = sum;
    
    SumP P4 = sum;

block访问外面的变量

block内部可以访问外部变量

    int a = 5;
    
    void (^blockA)() = ^() {
        
        NSLog(@"%d",a);
    };
    
    blockA();

打印结果为

2016-09-15 14:01:18.552 block[590:22729] 5

默认情况下block内部不能修改外面的局部变量

  • 如下这样写会报错
    
    int a = 5;
    
    void (^blockA)() = ^() {
        
        a = 3;
    };
    
  • 给局部变量加上__block关键字,这个局部变量就可以block内部修改(如下这样不会报错)
    
    __block int a = 5;
    //变量前加上__block修饰符
    void (^blockA)() = ^() {
        
        a = 3;
    };
    
    blockA();

typedef重定义block类型

  • typedef重定义block类型和函数指针很像
 typede int (^MyBlock)(int, int); MyBlock 是类型名
 
 MyBlock sumBlock;
 //定义一个MyBlock类型的变量
 sumBlock = ^(int a, int b) {
        return a + b;
    };
//给block变量赋值保存的代码


我们定义一个减法类型的
    MyBlock minusBlock = ^(int a, int b) {
        return a - b;
    };
    
    int minus = minusBlock(25,12);
    
    NSLog(@"%d",minus);
 
 //使用MyBlock类型连续定义变量 
   MyBlock a, b; 

总结

1>.如何定义block变量

int (^sumBlock)(int, int);
 void (^myBloc)();

2> 如何利用block封装代码

^(int a, int b) {
 return a - b;
 }
 
 ^() {
 NSLog(@"--------");
 }
 
 ^ {
  NSLog(@"--------");
 //参数为空时()可以省略
 }

3> block访问外部变量

  • block内部可以访问外部变量
  • 默认情况下block内部不能修改外面的局部变量
  • 给局部变量加上__block关键字,这个局部变量就可以block内部修改 原因--(将OC代码反编译C++可以看到)block与外部变量默认是值传递,当加上__block修饰之后就会修改成地址传递,这样就可以修改外部变量了

4>利用typeddef定义block类型



typedef int (^MyBlock)(int, int);




MyBlock block; //定义一个MyBlock 类型的变量
 
 MyBlock block1, block2; //连续定义两个MyBlock 类型的变量
 
 
 block1 = ^(int a, int b) {
 
 return a - b;
 };
 
 MyBlock block3 = ^(int a, int b) {
 return a + b;
 };
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。...
    Coder_JMicheal阅读 4,030评论 2 1
  • iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,B...
    smile刺客阅读 6,936评论 2 26
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 9,136评论 0 23
  • 在介绍Block之前通过一个简单的应用场景认识下Block 场景描述如下:TableView上面有多个Custom...
    黑_白_灰阅读 5,224评论 4 29
  • 原文地址:Objective-C中的Block 1.相关概念 在这篇笔记开始之前,我们需要对以下概念有所了解。 1...
    默默_David阅读 3,064评论 0 1