block 回调个人理解
在网上见过这么个面试题
使用block和GCD时要注意些什么?他们是一回事吗?block在ARC和MRC的用法有什么不同?使用时要注意些什么?
首先block 和 GCD 在我看来他们是完全不同的概念。在使用GCD的时候经常会用block作为回调 下面记下刚刚研究的成果
根据序号标出执行顺序
typedef int (^ myBlock)(int m) ; 首先定义一种类型 这里可以没有返回值
- (void)viewDidLoad
{
[super viewDidLoad];
[ self print:^int(int m) { // 1 .在这里转入一个block 给print 方法 这个很好理解
NSLog(@"====>%d",m); // 9. 所以这里为第二次回调 这里hello 这个block 中m的值给了这里m的值 所以第二次打印在这里
return m; // 10.然后由于前面定义block的时候有返回值
}];
} // 15
- (void)print:(myBlock)my // 2 . 当调用方法后 应该开始执行该方法
{
[self hello:^int(int m) { //3. 一样传入一个block 给hello 这个方法
NSLog(@"--->%d",m); // 7. 由于开始执行hi block块 block块的主体在这里 所以这里第一次打印 同时完成第一次回调 下面k 的值传到了这里m= k = 9
my(m); // 8 . 开始执行my这个block块
return 2 ; // 11 .
}];
}// 14
- (void)hello:(myBlock)hi // 4. 开始执行这个方法
{
int k = 9 ; // 5 .
hi(k); // 6. 这里开始调用hi 这个block快
NSLog(@"+++>%d",k);//12. 然后在到这里 所以这里是最后一次打印
} // 如果还要继续写当然 这里是13
看下打印结果
2014-09-02 16:39:44.933 calendar[11511:60b] --->9
2014-09-02 16:39:48.059 calendar[11511:60b] ====>9
2014-09-02 16:39:51.855 calendar[11511:60b] +++>9
我以前一直怀疑block会自动生成一个线程然后在另一个线程中去工作 由上面的执行顺序发现他还是同步的 非常规矩的一步一步的执行 有时候我们在使用block时候
会发现他是异步调用的 这只能说明别的地方使用的时候是异步的 所以回调的时候显得异步 来代码更明显
如果我把这个方法改变成这样
- (void)print:(myBlock)my
{
[self hello:^int(int m) {
NSLog(@"--->%d",m);
[UIView animateWithDuration:1 animations:^{ // 一下想不到什么异步的方法
} completion:^(BOOL finished) {
my(m);
NSLog(@"我在最后执行那就说明block不是异步,不是他干的");
}];
return 2 ;
}];
}
打印结果马上就变成这样 这个时候感觉block本身是异步的 其实不然
2014-09-02 17:00:04.621 calendar[11672:60b] --->9
2014-09-02 17:00:04.670 calendar[11672:60b] +++>9
2014-09-02 17:00:04.914 calendar[11672:60b] ====>9
2014-09-02 17:08:38.898 calendar[11754:60b] 我在最后执行那就说明block不是异步,不是他干的
block 和 多线程没什么关系 所以不认为和 block和GCD 是一回事
然后有这么一种写法 记录下
NSLog(@"%d", ^ (int a){
return a * a ;
}(5) );
然后block 可能会引起内存泄露
http://www.cnbluebox.com/?p=255 这个写的很详细 还没完全弄懂
block 回调个人理解的更多相关文章
- Objective-C中的Block回调模式
在前面的博客中提到了Block的概念和使用方法,个人感觉Block最爽的用法莫过于在回调时用block.感觉比委托回调和目标方法回调用着要顺手,好不好用还得读者亲自用一下才知道.如果 读者之前用过SS ...
- iOS 键盘添加完成按钮,delegate和block回调
这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...
- Block回调
•Block的定义 •Block.委托.通知.回调函数,它们虽然名字不一样,但是原理都一样,都是"回调机制"的思想的具体实现 •前面的代理模式的项目改为Block回调实现 ...
- UIAlertController——之Block回调
iOS8.0之后出现的提示框 =.=,比自己去改block回调要好.
- 第十篇、自定义UIBarButtonItem和UIButton block回调
// 自定义导航栏左边按钮 self.navigationItem.leftBarButtonItem = [JQBlockedBarButtonItem blockedBarButtonItemWi ...
- iOS很重要的 block回调
刚刚进入ios开发行业,发现开发中要用到大量的block回调,由此可见它的重要性.学习它之前我也是网上找的资料,推荐这篇文章http://blog.csdn.net/mobanchengshuang/ ...
- 代码块(Block)回调一般阐述
本章教程主要对代码块回调模式进行讲解,已经分析其他回调的各种优缺点和适合的使用场景. 代码块机制 Block变量类型 Block代码封装及调用 Block变量对普通变量作用域的影响 Block回调接口 ...
- 63.delegate回调 和block回调
效果:viewController里面放置一个按钮和Lab,点击按钮进入oneViewController(delegate回调)或者BlockViewController(block回调),两者控制 ...
- iOS开发-Block回调
关于Block之前有一篇文章已经写过一篇文章Object-C-代码块Block回顾,不过写的比较浅显,不能体现出Block在实际开发中的重要性,关于Block的基础知识,可以参考之前的博客.在实际开发 ...
随机推荐
- log4j2介绍及配置
一.log4j2概述 在日常的开发,测试和生产环境中,日志记录了应用,服务运行过程中的关键信息,以及出现异常时的堆栈,这些信息常常作为查询,定位,解决问题的关键,因此在任何系统中,对日志的使用得当,将 ...
- linux创建新用户后shell无法自动补全命令或使用基本的shell命令
新建一用户lqding,切换到该用户下 root@lqding:~# su - lqding$$ echo $USERlqding$ ^[[A 提示符仅仅是一个$,很奇怪.输入命令,用TAB键也无法补 ...
- 前端基础(JavaScript)
JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.( ...
- Django的FBV和CB
Django的FBV和CBV FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以不再赘述. CBV C ...
- 7.2 Models -- Defining Models
一.概述 1. 模型是一个类,它定义了你呈现给用户的数据的属性和行为.用户希望如果他们离开你的应用程序,并返回后(或如果他们刷新页面)看到的任何东西应该被一个model代表. 2. 确保在ember. ...
- (3)在Windows7上搭建Cocos2d-x
工具准备 搭建开发环境需要安装工具包括 Visual Studio python ———(本教程以python2.7.3版本为例),下载地址:http://www.python.org/downloa ...
- ACM-ICPC 2018 焦作赛区网络预赛 Solution
A. Magic Mirror 水. #include <bits/stdc++.h> using namespace std; int t; ]; inline bool work() ...
- EditPlus 4.3.2475 中文版已经发布(10月28日更新)
新的修订版修复了上移多个插入点时会造成程序崩溃的问题.
- 学号20155308 2016-2017-2 《Java程序设计》第7周学习总结
学号20155308 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十二章 使用Optional代替null 标准API的函数接口 API 功能 Cons ...
- linux内核分析第五周-分析system_call中断处理过程
本实验目的:通过以一个简单的menu小程序,跟踪系统调用的过程,分析与总结系统调用的机制和三层进入的过程. 实验原理:系统调用处理过程与中断处理的机制 系统调用是通过软中断指令 INT 0x80 实现 ...