Blocks理解:

Blocks可以访问局部变量,但是不能修改

如果修改局部变量,需要加__block

__block int multiplier = 7;

int (^myBlock)(int) = ^(int num) {

multiplier ++;//这样就可以了

return num * multiplier;

};

2、如果局部变量是数组或者指针的时候只复制这个指针,两个指针指向同一个地址,block只修改指针上的内容。如:

NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil];

NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1];

[mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){

[mArrayCount addObject:[NSNumber numberWithInt:[obj length]]];

}];

NSLog(@"%@",mArrayCount);

例子里面确实没有修改mArrayCount这个局部变量啊。mArrayCount是一个指针,指向一个可变长度的数组。在block里面,并没有修改这个指针,而是修改了这个指针指向的数组。换句话说,mArrayCount是一个整数,保存的是一块内存区域的地址,在block里,并没有改变这个地址,而是读取出这个地址,然后去操作这块地址空间的内容。

这是允许的,因为声明block的时候实际上是把当时的临时变量又复制了一份,在block里即使修改了这些复制的变量,也不影响外面的原始变量。即所谓的闭包。

但是当变量是一个指针的时候,block里只是复制了一份这个指针,两个指针指向同一个地址。所以,在block里面对指针指向内容做的修改,在block外面也一样生效。

__weak __typeof(&*self)weakSelf =self; 等同于

__weak UIViewController *weakSelf =self;

为什么不用__block 是因为通过引用来访问self的实例变量 ,self被retain,block也是一个强引用,引起循环引用,用__week是弱引用,当self释放时,weakSelf已经等于nil。

扩展:NSTimer注意避免循环引用的地方,需要找个合适的时机和地方来 invalidate timer

在引用计数的环境里面,默认情况下当你在block里面引用一个Objective-C对象的时候,该对象会被retain。当你简单的引用了一个对象的实例变量时,它同样被retain。但是被__block存储类型修饰符标记的对象变量不会被retain

注意:在垃圾回收机制里面,如果你同时使用__weak和__block来标识一个变量,那么该block将不会保证它是一直是有效的。 如果你在实现方法的时候使用了block,对象的内存管理规则更微妙:也是(__weak与__block区别:)

1、如果你通过引用来访问一个实例变量,self会被retain。

2、如果你通过值来访问一个实例变量,那么变量会被retain

原文地址:http://blog.csdn.net/leikezhu1981/article/details/45009123

文/你的猴哥(简书作者)
原文链接:http://www.jianshu.com/p/ba50850ae0a5
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

最新文章

  1. Linux下介绍一款不错的HTML编辑器
  2. MSSQLServer中组织或分类表的设计及其递归查询
  3. 使用Open xml 操作Excel系列之一-读取Excel
  4. [转]RamDisk导致远程桌面客户端无法启动问题
  5. [Java Web] 2、Web开发中的一些架构
  6. 帮初学者改代码——playerc之“练习:求完数问题”(上)
  7. 100offer 为专业程序打造的招聘平台
  8. HDU 1272 小希的迷宫 (并查集)
  9. Java 测试Hibernate+Mysql简单的数据存储
  10. POJ2485——Highways
  11. 敏捷冲刺每日报告——Day4
  12. ChartControl设置坐标轴范围
  13. 对于bilibili主页head部分的代码的总结以及疑问。
  14. java实现注册的短信验证码
  15. kernel笔记——定时器与时间管理
  16. drf序列化组件
  17. 微信浏览器软键盘弹出与页面resize的问题
  18. 用汇编语言角度来理解C语言的一些问题
  19. WiFi-ESP8266入门http(2-2)文件系统-复杂结构的网页 + 文本框交互WIFI信息
  20. Jackson 解析json数据之忽略解析字段注解@JsonIgnoreProperties

热门文章

  1. 【转载】在 2016 年做 PHP 开发是一种什么样的体验?(一)
  2. The Solution of UESTC 2016 Summer Training #1 Div.2 Problem A
  3. CGI和ISAPI
  4. C语言中的sizeof()
  5. 最近碰到的一些 SSL 问题记录
  6. Android提权漏洞CVE-2014-7920&CVE-2014-7921分析
  7. 在Visual Studio中将现有.NET Framework项目迁移至.NET Core 1.1 Preview 1
  8. (DNS被劫持所导致的)QQ音乐与视频网页打开很慢的解决方法
  9. 2013 duilib入门简明教程 -- 其他 (18)
  10. Oracle 创建普通用户,并赋予权限