经验之谈—让你看明确block
- 事实上我感觉不常常使用block的朋友。对block应该是比較陌生的,那么如今我们来扒开block的真面目,看看block的本质
普通的局部变量。block内部仅仅会引用它初始的值(block定义那一刻),不能跟踪它的改变
void test()
{
int age = 10;
void (^block)() = ^{
// 普通的局部变量,block内部仅仅会引用它初始的值(block定义那一刻),不能跟踪它的改变
NSLog(@"----age=%d", age);
};
age = 20;
block();
}
这里的结果是10;事实上在编译的时候,是相当于这种:
void test2()
{
int age = 10;
void (^block)() = ^{
// 普通的局部变量,block内部仅仅会引用它初始的值(block定义那一刻),不能跟踪它的改变
NSLog(@"----age=%d", 10);
};
age = 20;
block();
}
这里的这个值 是死的。
所以不管你后面把age改成多少。block都不关心。换句话说:这里的age是局部变量,出了大括号就死了。所以直接把这个10拿过来,比較安全
我们看一下。被block引用的变量的情况:
block内部可以一直引用被__block修饰的变量
void test3()
{
__block int age = 10;
void (^block)() = ^{
// block内部可以一直引用被__block修饰的变量
NSLog(@"----age=%d", age);
};
age = 20;
block();
}
这里:block能一直监听着这个age的值的改变(不管是局部变量还是全局变量),所以这里打印出来的是age是20
__block修饰的变量,就能保住这个变量的命
这里我们来看一下。被static修饰的变量。是静态变量,静态是永远在内存中。所以block看到static修饰的这个变量是永远存在内存中的。那么block就能每次都能拿到这个变量,所以你age的值的改变。block都能拿到。所以这是动态訪问的,不是把10直接拿过来
void test4()
{
static int age = 10;
void (^block)() = ^{
// block内部可以一直引用被static修饰的变量
NSLog(@"----age=%d", age);
};
age = 20;
block();
}
int num = 10;
void test5()
{
void (^block)() = ^{
// block内部可以一直引用全局变量
NSLog(@"----num=%d", num);
};
num = 20;
block();
}
这里打印出来的num 是20 。
为什么呢?
由于这里的num是全局变量。那么既然是全局变量,就一直在内存中,block就能实时跟新这个值的改变。
总结,那么我们如今推断的时候,我们仅仅须要推断这个变量是不是立即就销毁了即可了。可是注意一下__block修饰的变量即可
经验之谈—让你看明确block的更多相关文章
- Objective-C中的Block(闭包)
学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过Javascript的小伙伴对闭包应该不陌生吧~学过PHP的应该也不陌生,在PHP5.3版本以后也 ...
- iOS-重回block小白之路
在我刚刚接触iOS开发的时候,是通过MJ老师讲的OC基础入门的,iOS圈的人应该基本都知道MJ大神吧,即便如此大神,讲解完block之后我依然感觉晕晕乎乎的,直到后来真正进公司做项目,依然感觉这是自己 ...
- iOS Block 内存管理的探讨
在很多情况下Block是造成程序循环引用内存泄漏的元凶.下面我们就讲解一下block对内存管理的影响.在讲解之前.希望大家对block有一定的了解.如果大家还不是太清楚block的实现原理.希望大家可 ...
- iOS开发Block的使用
Block 是从 iOS4引入的,在日常开发中,会经常用到Block.特别是在多线程中,Block的用处更广泛.而且,Block不仅可以接收参数,其本身也可以作为参数,因此,Block的功能非常强大. ...
- Objective-C中的Block(闭包) (轉載)
来源: 伯乐在线 - 青玉伏案 链接:http://ios.jobbole.com/83229/ 学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过 ...
- block没那么难(二):block和变量的内存管理
本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 了解了 block的实现,我们接着 ...
- block没那么难(一):block的实现
本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> block 顾名思义就是代码块,将 ...
- 有趣 IOS 开展 - block 使用具体解释
Block 它是iOS于4.0新的程序语法之后,于iOS SDK 4.0之后,block应用几乎无处不在. 在其他语言中也有类似的概念,称为闭包(closure),实例object C兄弟swift ...
- 关于 Block 中捕获 self 的分析
问题 最近遇到一个已经使用了weak-strong dance的block依旧强引用了self的情况,好在block没被VC持有只是延迟释放,但这里的关键是用了weak_self的blcok理应不会强 ...
随机推荐
- 从终端运行python程序
终端窗口运行.py程序 首先你要安装python,命令行输入 python 有python提示符 >>> 出现说明安装成功 程序第一行应该是 #! python3 #! python ...
- Python 生成器 Generator 和迭代器 Iterator
#最近一周刚开始接触python,基本的语法,和使用特性和Java差别还是蛮大的. 今天接触到Python的迭代器和生成器有点不是很明白,所以搜索了先关资料整理了一些自己的理解和心得 简述(Profi ...
- Redis序列化存储Java集合List等自定义类型
在"Redis学习总结和相关资料"http://blog.csdn.net/fansunion/article/details/49278209 这篇文章中,对Redis做了总体的 ...
- linux(debian/ubuntu)下连接安卓手机--小米4为例
更改:如今小米连接Ubuntu等Linux系统,直接改动手机上的连接方式就可以. --------------------------------------------- 因为安卓手机底层就是lin ...
- linux 下的select函数
函数原型 /* According to POSIX.1-2001 */ #include <sys/select.h> //头文件 /* According to earlier st ...
- Chromium Graphics : GPU Accelerated Compositing in Chrome
GPU Accelerated Compositing in Chrome Tom Wiltzius, Vangelis Kokkevis & the Chrome Graphics team ...
- 实现人脸识别性别之路---open CV将图片显示出来
import cv2filename='E:\\tensorflow\\bu.jpg'#图片的地址 # face_cascade=cv2.CascadeClassifier('C:\\anconda3 ...
- react基础课程一简述JSX及目录关系
简述JSX及目录关系 简述:它被称为JSX,它是JavaScript的语法扩展,JSX是一种模板语言,但它具有JavaScript的全部功能.所以学习jsx还是需要学习基础的javaScript的. ...
- 紫书 习题 10-32 UVa 1414 ( 迷之规律)
看了其他人博客,貌似i个盘子的方案数满足 f[i] = f[i-1] * x + y ??????? 神来之笔 貌似没有找到严格的证明-- 牛逼-- 如果这样的话暴力求出x和y然后递推完事 #incl ...
- Swift学习笔记(10)--枚举
1.定义语法: enum SomeEnumeration { // enumeration definition goes here } 2.使用 enum CompassPoint { case N ...