初始block,关于定义的几个小题目
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,关于定义的几个小题目的更多相关文章
- JAVA关于字符串&&字符数组处理的小题目
JAVA关于字符串&&字符数组的小题目 第二题:分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: ...
- js小题目(持续更新)
总是感觉之前做过的问题很久没碰的话就会忘掉,于是打算专门开一个记录小题目的随笔当题典用. 目录 五种主要数据类型进行值复制 数组去重 数组去重并计数 实现clone()方法,对五种主要数据类型进行值复 ...
- 自家人不认识自家人——考你一道有趣的Javascript小题目
今天的内容很简单,给大家分享一个有趣的Javascript小题目. 题目很简单,就是填空: var a = ______; var b = a; alert(a==b); // alert " ...
- 用CIL写程序:定义一个叫“慕容小匹夫”的类
前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...
- block的定义及使用
(1)最基础的用法案例,我们可以把block理解为一段类似变量一样的可执行函数代码片段: void (^printBlock)(NSString *x); printBlock = ^(NSStrin ...
- Python递归函数的定义和几个小例子
递归函数 (1)什么是递归函数? 我们都知道,一个函数可以调用其他函数.如果这个函数在内部调用它自己,那么这个函数就叫递归函数. (2)递归函数的作用 举个例子,我们来计算阶乘 n! = 1 * 2 ...
- svg如何用marker 定义一个黑色的小圆点
<defs> <marker id="markerStartArrow" viewBox="0 0 30 30" refX="10& ...
- Swift入坑--block的定义
typealias methodCompletionBlock = (String)->Void
- python小题目练习(六)
需求:编写一个猜数字的小游戏,随机生成1到10(包含1和10)之间的数字作为基准数,玩家每次通过键盘输入一个数字,如果输入的数字跟基准数相同,则闯关成功,否则重新输入,如果玩家输入的是-1,则表示退出 ...
随机推荐
- sqlmap 技巧整理
收集了一些利用Sqlmap做注入测试的TIPS,其中也包含一点绕WAF的技巧,便于大家集中查阅,欢迎接楼补充.分享. TIP1 当我们注射的时候,判断注入 http://site/script?id= ...
- Arcgis报错: Bad login user Failed to execute (CreateEnterpriseGeodatabase).
在使用工具Create Enterprise Geodatabase的时候报错Bad login user,开始怀疑为密码错误,然后反复在plsql中尝试发现并没有错误,很疑惑,然后去官网查询: Er ...
- ruby -- 基础学习(四)TimeDate处理
TimeDate格式化输出: DateTime.parse(Time.now.to_s).strftime('%Y-%m-%d %H:%M:%S').to_s #就是按照2013-8-16 16:4 ...
- Tips5:通过 alt+鼠标左键 来完全展开或收缩层级
通过 alt+点击 可以完全地展开或关闭unity中的各种层级关系,包括Hierarchy视图 或 Project视图中的. 上图中,第一次点击没有按住ALT键,可以发现子项目并没有被展开,而第二次是 ...
- T4语法快速入门
1.什么是T4? T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit.T4(Text Template Transformation Toolk ...
- IOS开发UI基础UISwitch属性
UISwitch属性1. onTintColor 处于on时switch 的颜色 switchImage.onTintColor = [UIColor grayColor];2.tintC ...
- iOS实现图像指定区域模糊
在大多图像处理中,我们会应用到高斯模糊处理图像,通常用它来减少图像噪声以及降低细节层次.在此文中介绍了高斯模糊的实现和可选区域的模糊[美图秀秀-背景虚化] 高斯模糊的原理中,它是根据高斯曲线调节像素色 ...
- 网络编程:socket--python核心编程(3),chapter 1
最近两天把第一部分的网络编程socket好好学习了一番,收获也蛮多的... 套接字:能使运行在不同或相同计算机上运行的进行通信:套接字一种是基于文件的(同一台计算机进程间通信),另一种是基于网络的(同 ...
- mysql如何更改数据库名(一键实现mysql改数据库名)
由于某种原因,有时我们有可能需要数据库的名称,但是不像官方有rename可以去更改表名,并没有一个命令可以去更新数据库的名字. 思路:借助rename这个命令 基本操作:rename olddb.ta ...
- 后缀数组 --- HDU 3518 Boring counting
Boring counting Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3518 Mean: 给你一个字符串,求:至少出 ...