初始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,则表示退出 ...
随机推荐
- mysql 行转列
SELECTREPLACE(GROUP_CONCAT(IF(ItemID=1101,ItemValue,"")),',',"") AS 'Item1101',R ...
- ListView不规律刷新多次,重复执行getView
写ListView的时候,有时会发现ListView中的getView执行多次,有的时候又不是,搞了半天才找到原因,在http://blog.csdn.net/danielinbiti/article ...
- 爬虫技术 -- 进阶学习(七)简单爬虫抓取示例(附c#代码)
这是我的第一个爬虫代码...算是一份测试版的代码.大牛大神别喷... 通过给定一个初始的地址startPiont然后对网页进行捕捉,然后通过正则表达式对网址进行匹配. List<string&g ...
- 【转载】Unix Shell中用[-n]判断字符串不为NULL
转载自:http://blog.sina.com.cn/s/blog_541086430100mosm.html 在Unix Shell中,可以使用-n来判断一个string不是NULL值,但是之前却 ...
- C++中指针和引用的区别
①指针可以为空,引用不能为空: ②指针可以被赋值,引用必须在声明时赋值,之后不能被赋值: ③指针可以指向堆中空间,引用不能指向堆中空间,如int &p=new int; 会编译出错.
- 数据库收缩:NOTRUNCATE与TRUNCATEONLY
在进行数据库收缩时,我们有2个可用选项:NOTRUNCATE,TRUNCATEONLY.这篇文章我们会详细讨论下这2个选项的具体区别. NOTRUNCATE 当你对数据库收缩命令提供NOTRUNCAT ...
- python面向对象编程(下)
本篇详细介绍了Python 中类的成员.成员修饰符.类的特殊成员以及两个综合运用实例. 环境为:python3.5.1 类的成员 类的成员包括三大类:字段.方法和property属性 注:关于这三类成 ...
- [Solution] 使用Autofac在MVC、Web API、WCF中实现IOC
本来想聊一下面试过程的,1个星期面了6家,4家当场给offer,2家技术通过(1家没下文,1家复试).从中也学习到一些东西,先还是继续Coding吧. 官网:http://autofac.org/ 下 ...
- Web前端面试题集锦
前端开发面试知识点大纲: 注意 转载须保留原文链接(http://www.cnblogs.com/wzhiq896/p/5927180.html )作者:wangwen896 HTML&CSS ...
- HNU 13308 Help cupid
Help cupid Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13308&c ...