block的定义和C语言指针函数非常相似,就可以照着指针函数的方法去依葫芦画瓢就可以了

block中的^只是用来表示这是一个block对象,和函数指针中的*作用一样,只是一个标识符

下面有三个小例子来帮助理解:

1,写一个返回值为整型,参数为NSString(仅一个参数)的block,实现将字符串转换为整型的功能。

int (^change)(NSString *) = ^int (NSString *str) {
return [str intValue];
}; NSString *str = @"";
NSLog(@"%d", change(str)); // 可以用typedef给方法重命名,没有其他意义,这还是同一种方法
typedef int (^CHANGE)(NSString *);
CHANGE change = ^int (NSString *str) {
return [str intValue];
}; NSString *str = @"";
NSLog(@"%d", change(str));

2.定义一个block, 返回值是NSString对象,参数是NSArray对象,实现从数组中取出第三个元素的功能

 NSString *(^gain)(NSArray *) = ^NSString *(NSArray *array) {
return [array objectAtIndex:];
}; NSArray *array = @[@"yinhao", @"yinxiao", @"yinshuanghao", @"yindongdong"];
NSString *str = gain(array);
NSLog(@"%@", str); // 和刚才一样,用typedef只是为了装那啥,没有其他意义,这还是同一种方法
typedef NSString *(^GAIN)(NSArray *);
GAIN gain = ^NSString *(NSArray *array) {
return [array objectAtIndex:];
}; NSArray *array = @[@"yinhao", @"yinxiao", @"yinshuanghao", @"yindongdong"];
NSString *str = gain(array);
NSLog(@"%@", str);

3.

int a = 10;

void (^myBlock)() =

^{

NSLog(@"a = %d",a);

};

myBlock();

第一问:在block块内部能否访问到外部变量

第二问:在block块内部能否改变外部变量的值

第三问:block内部访问a和外部变量a的地址是否一样

第四问:如果我想在block内部改变外部的值该怎么办?

 // 第一问:当然可以,当我们运行之后发现,控制台有输出结果,就说明能访问外部的变量

 // 第二问:不可以
int a = ; // 局部变量,存放在栈区 void (^myBlock)() =
^{
a = ; // 以const的方式进行值拷贝
};
myBlock(); //第三问: 不一样 外部a存放在栈区,内部a存放在堆区
int a = ;
NSLog(@"外部a = %p", &a);
void (^myBlock)() =
^{
NSLog(@"内部a = %p", &a);// 堆区地址后六位有值
};
myBlock(); // 第四问:方法一:把外部变量定义成全局变量,方法二:在局部变量前加__block;我推荐第二种方法
__block int a = ; // 局部变量,存放在栈区 void (^myBlock)() =
^{
NSLog(@"a = %d",a); // 以const的方式进行值拷贝,不可以改变,存放在堆区
};
myBlock();

初始block,关于定义的几个小题目的更多相关文章

  1. JAVA关于字符串&&字符数组处理的小题目

    JAVA关于字符串&&字符数组的小题目 第二题:分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: ...

  2. js小题目(持续更新)

    总是感觉之前做过的问题很久没碰的话就会忘掉,于是打算专门开一个记录小题目的随笔当题典用. 目录 五种主要数据类型进行值复制 数组去重 数组去重并计数 实现clone()方法,对五种主要数据类型进行值复 ...

  3. 自家人不认识自家人——考你一道有趣的Javascript小题目

    今天的内容很简单,给大家分享一个有趣的Javascript小题目. 题目很简单,就是填空: var a = ______; var b = a; alert(a==b); // alert " ...

  4. 用CIL写程序:定义一个叫“慕容小匹夫”的类

    前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...

  5. block的定义及使用

    (1)最基础的用法案例,我们可以把block理解为一段类似变量一样的可执行函数代码片段: void (^printBlock)(NSString *x); printBlock = ^(NSStrin ...

  6. Python递归函数的定义和几个小例子

    递归函数 (1)什么是递归函数? 我们都知道,一个函数可以调用其他函数.如果这个函数在内部调用它自己,那么这个函数就叫递归函数. (2)递归函数的作用 举个例子,我们来计算阶乘 n! = 1 * 2 ...

  7. svg如何用marker 定义一个黑色的小圆点

    <defs> <marker id="markerStartArrow" viewBox="0 0 30 30" refX="10& ...

  8. Swift入坑--block的定义

    typealias methodCompletionBlock = (String)->Void

  9. python小题目练习(六)

    需求:编写一个猜数字的小游戏,随机生成1到10(包含1和10)之间的数字作为基准数,玩家每次通过键盘输入一个数字,如果输入的数字跟基准数相同,则闯关成功,否则重新输入,如果玩家输入的是-1,则表示退出 ...

随机推荐

  1. 使用的 SQL Server 版本不支持数据类型“datetime2”的错误解决方法

    THE VERSION OF SQL IN USE DOES NOT SUPPORT DATATYPE ‘DATETIME2′ 主要错误原因,在使用ado.net entity的时候,entity使用 ...

  2. [IR] Probabilistic Model

    If user has told us some relevant and some irrelevant documents, then we can proceed to build a prob ...

  3. [转载]SharePoint 2013搜索学习笔记之搜索构架简单概述

    Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...

  4. Screensiz.es – 最流行移动设备及显示器的屏幕规格大全

    Screensiz.es 帮助您快速找到目前市场上最流行的设备和显示器的屏幕规格.尺寸数据来自维基百科,使用更好理解的像素密度.流行度推算自 Google 查询(从 AdWords 流量估算),以及一 ...

  5. 手把手教你从购买vps到搭建一个node服务器

    要准备什么? 1.5刀 2.最好有FQ软件(可以用蓝灯) let's Go! 一.vps购买 vps可以选择digital ocean(do) 链接 ,由于是外国网站,响应比较慢,所以最好翻个墙. g ...

  6. python反转字符串(简单方法)及简单的文件操作示例

    Python反转字符串的最简单方法是用切片: >>> a=' >>> print a[::-1] 654321 切片介绍:切片操作符中的第一个数(冒号之前)表示切片 ...

  7. struts2重点——ModelDriven

    一.属性驱动 在目标 Action 类中,通过 setXxx() 方法来接收请求参数. 二.模型驱动 1.ParametersInterceptor 拦截器工作原理 ParametersInterce ...

  8. Scrum1.2--spring计划

    项目功能--深入分析  燃尽图

  9. $.ajax、$.post、from表单序列化工具

    $.ajax\$.post <script type="text/javascript" language="javascript" src=" ...

  10. 线段树 + 矩阵 --- ZOJ 3772 Calculate the Function

    Calculate the Function Problem's Link:   http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCod ...