初始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,则表示退出 ...
随机推荐
- sudo: /etc/sudoers is mode 0777, should be 0440终极解决之道
不得不说,有时候手贱的把/etc/sudoers文件权限改了,是一件很蛋疼的事.因为此时你会发现无论做什么都会弹出一条讨厌的提示,说没有权限执行等等... 网上有介绍登入root用户,或者去grub的 ...
- 剑指架构师系列-Linux下的调优
1.I/O调优 CentOS下的iostat命令输出如下: $iostat -d -k 1 2 # 查看TPS和吞吐量 参数 -d 表示,显示设备(磁盘)使用状态:-k某些使用block为单位的列强制 ...
- 自己动手模拟百分百<select>下拉列表
浏览器默认的下拉确实不好用啊,主要是样式不好修改和统一. (一)下手之前先理清一下<select>的流程: 1.结构:<select> <option value=&qu ...
- 『设计前沿』14款精致的国外 iOS7 图标设计示例
每天都有大量的应用程序发布到 iOS App Store 上,在数量巨大的应用中想要引起用户的主要,首要的就是独特的图标设计.这篇文章收集了14款精致的国外 iOS7 图标设计示例,希望能带给你设计灵 ...
- 开放产品开发(OPD):开篇
OPD?这是什么玩意?google一下.忘记说了,最近google被封锁的厉害,那就百度一下吧.可惜,OPD找不出是什么.你今天你找不到是正常的,因为之前还没有OPD,而现在才开始有OPD这个东东.相 ...
- 转载:第六弹!全球首个微信小程序(应用号)开发教程!通宵吐血赶稿!
大家好!博卡君原计划是能在国庆假期前把小程序的开发教程做完,给大家一套完整.系统的东西,不过由于最近小程序开发工具的拍照组件尚未完善,很多功能还不能顺利实现.我考虑了一下,觉得不如把拍照部分的一些代码 ...
- iOS实现图像素描效果
使用GPUImageSketchFilter对象实现图像素描效果 NSString *const kGPUImageSketchFragmentShaderString = SHADER_STRING ...
- 点餐APP 冲刺二总结
冲刺二我们小组主要是实现数据库的增删改查等功能, 因为小组成员对数据库都不是很熟悉,所以花了比较多 的时间去学习,功能实现起来也是很艰难,所以第二个 冲刺结束后我们的数据库还是有点问题,不能成功 ...
- 重构第30天 尽快返回 (Return ASAP)
理解:把条件语句中复杂的判断用尽快返回来简化. 详解:如首先声明的是前面讲的”分解复杂判断“,简单的来说,当你的代码中有很深的嵌套条件时,花括号就会在代码中形成一个长长的箭头.我们经常在不同的代码中看 ...
- 【C#进阶系列】04 类型基础
关于System.Object 所有类型都从System.Object派生而来. System.Object的公共方法中ToString()一般是返回对象的类型的全名,只有Int32这些类型将其重写后 ...