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

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

1、关于block

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

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

^是block语法的标识。

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

有自己的局部变量

可以传入参数

有返回值

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

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

作为参数传递给其它函数

3、block的基本语法

4、block的使用

  1. 无返回值无参数

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

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

5、block的注意点

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

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

6、整体应用代码

 #import <Foundation/Foundation.h>

 typedef int (^MyBlock)(int,int); // block类型

 int cc = ;
int main(int argc, const char * argv[]) { int a = ;
__block int b = ;
void (^voidBlock)() = ^{
NSLog(@"------------");
//在bloc体内不能修改非__block声明的局部变量,可以修改全局变量和用__block声明的局部变量
//a = 10;
b = ;
cc = ;
};
NSLog(@"%d %d %d",a,b,cc);
voidBlock();
NSLog(@"%d %d %d",a,b,cc); int (^sumBloc)(int , int);
sumBloc= ^(int a,int b){ return a+b;
};
int (^subBloc)(int,int) = ^(int a,int b){
return a - b ;
}; int sum = sumBloc(,);
int sub = subBloc(,); NSLog(@"sum = %d sub = %d",sum,sub); voidBlock(); //------ typedef block类型用法------------ MyBlock sum1 = ^(int a,int b){
return a + b ;
}; MyBlock sub1 ;
sub1 = ^(int a ,int b){
return a - b ;
}; NSLog(@"sum1 = %d sub1 = %d",sum1(,),sub1(,)); return ;
}

OC学习4——OC新特性之块(Block)的更多相关文章

  1. 可能是最早的学习Android N新特性的文章

    可能是最早的学习Android N新特性的文章 Google在今天放出了Android N开发者预览版.Android N支持Nexus6及以上的设备.5太子Nexus5不再得到更新. Android ...

  2. 从零开始一起学习SLAM | C++新特性要不要学?

    LAM,C++编程是必备技能.不过,大家在学校里学习的书本一般比较老,主要还是C++98那些老一套. 本文所谓的C++新特性是指C++11及其以后的C++14.C++17增加的新关键字和新语法特性.其 ...

  3. iOS开发——新特性OC篇&IOS9 SDK新特性

    iOS9 SDK新特性 WWDC 2015苹果开发者大会是移动开发者一年一度的盛会,InfoQ中文站除了第一时间整理Keynote内容分享给大家之外,还邀请了资深的一线开发者分享他们的收获.本文为王巍 ...

  4. iOS开发——新特性OC篇&IOS9 系统新特性

    IOS9 系统新特性 2015年6月89号凌晨召开的WWDC 2015苹果开发者大会发布了全新的iOS 9系统,PC6小编今天给大家整理了这次iOS9的系统更新带来了哪些新的功能与升级,本次新功能一览 ...

  5. Java学习之==>Java8 新特性详解

    一.简介 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.Java 8是 Java 自 Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库. ...

  6. 前端学习笔记 --ES6新特性

    前言 这篇博客是我在b站进行学习es6课程时的笔记总结与补充. 此处贴出up主的教程视频地址:深入解读ES6系列(全18讲) 1.ES6学习之路 1.1 ES6新特性 1. 变量 2. 函数 3. 数 ...

  7. WEB学习笔记14-HTML5新特性的使用

    (1)定义文档类型声明 <!DOCTYPE html> (2)定义页面编码 <!—HTML 4.01中定义的设置页面编码的方式--> <meta http-equiv=& ...

  8. Java13新特性 -- 文本块

    在JDK 12中引入了Raw String Literals特性,但在发布之前就放弃了.这个JEP与引入多行字符串文字(text block) 在意义上是类似的. 这条新特性跟 Kotlin 里的文本 ...

  9. 在C++98基础上学习C++11新特性

    自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...

  10. ios学习路线—Objective-C(新特性)

    1.方法顺序无关 Objective-C类由声明文件h和实现文件m组成,所有的public方法都在h文件中声明,private方法可以写在m文件中,但是在早期的编译环境中需要注意方法的顺序,例如下面的 ...

随机推荐

  1. R语言-增加图例

    legend()函数 > plot(rain$Tokyo,type="l",col="red", + ylim=c(0,300), + main=&quo ...

  2. 微软microsoft word的api文档地址

    https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2003/aa172758(v%3doffice. ...

  3. 《CSAPP》符号解析

    符号解析 链接器解析符号引用的方法是将每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义联系起来.编译器只允许每个模块中每个本地符号只有一个定义. 对于全局符号,当编译器遇到一个不是在当 ...

  4. 36. Valid Sudoku 判断九九有效的数独

    [抄题]: Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according ...

  5. [leetcode]152. Maximum Product Subarray最大乘积子数组

    Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...

  6. centos7 下安装pycharm

    CentOS 7环境下Pycharm安装流程记录: 1.准备安装文件: 方法1: 使用内置火狐浏览器访问下载最新格式为tar.gz的压缩包 网址:https://www.jetbrains.com/p ...

  7. Linux驱动之定时器在按键去抖中的应用

    机械按键在按下的过程中会出现抖动的情况,如下图,这样就会导致本来按下一次按键的过程会出现多次中断,导致判断出错.在按键驱动程序中我们可以这么做: 在按键驱动程序中我们可以这么做来取消按键抖动的影响:当 ...

  8. python 包和模块

    一. 模块 使用内置函数vars()可以查看当前环境下有哪些对象(变量.函数.类) from 模块 import *: 不会导入以下划线开头的对象 只会导入__all__中定义了的对象(__all__ ...

  9. 搭建Fabric网络(四)运行网络

    启动网络 docker-compose -f docker-compose-cli.yaml up -d如果container cli关闭了,可以手动启动 docker start cli 设置环境变 ...

  10. [杂谈]杂谈章3 JAVA中如何用自动注入

    PART1 加配置文件 创建自动加载bean的配置文件 <beans xmlns="http://www.springframework.org/schema/beans" ...