__block 与 __weak的区别理解
2015-10-04 17:12
232 查看
__block 与 __weak的区别理解 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
相关文章推荐
- IOS使用XMPP最新教程(三)获取好友列表 (通过获取好友状态)
- 关于PHP sessions的超时设置
- AVL树的思想与C++实现
- java线程池学习(五) —— ThreadPoolExecutor源码分析
- LCD1602显示,用4位总线显示数字,字符,自定义字符,字符串,光标
- emacs 24.4.1 使用company mode智能提示C++程序
- linux tcpdump命令以及结果分析
- 摩托罗拉SE4500 三星 S3C6410 Wince6.0平台软解码调试记录以及驱动相关问题解释
- 摩托罗拉SE4500 三星 S3C6410 Wince6.0平台软解码调试记录以及驱动相关问题解释
- SqlDataReader和oledbDataReader和DataReader区别
- Mysql事务处理
- 返回多个值
- switch_case,&&,||,条件操作符和逗号操作符,循环语句
- JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
- C# WinForm开发系列 - DataGridView 使用方法集锦
- 五大基本常用算法概述
- TQ2440 使用Jlink-Flasher 烧写 u-boot 或者 program
- UINavigationController
- php 事务回滚
- 三种基本的存储引擎比较