__Block和__Weak的区别
2015-10-30 19:52
344 查看
__Block
1.__block对象在block中是可以被修改、重新赋值的。如果修改局部变量,需要加__block
__block int multiplier = 7; int (^myBlock)(int) = ^(int num) { multiplier ++;//这样就可以了 return num * multiplier; };
2.__block对象在block中不会被block强引用一次,从而不会出现循环引用问题。
3、如果局部变量是数组或者指针的时候只复制这个指针,两个指针指向同一个地址,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);
__Weak
__weak __typeof(&*self)weakSelf =self; 等同于 __weak UIViewController *weakSelf =self;
为什么不用__block 是因为通过引用来访问self的实例变量 ,self被retain,block也是一个强引用,引起循环引用,用__week是弱引用,当self释放时,weakSelf已经等于nil。
使用了__weak修饰符的对象,作用等同于定义为weak的property。自然不会导致循环引用问题,因为苹果文档已经说的很清楚,当原对象没有任何强引用的时候,弱引用指针也会被设置为nil。
__block和__weak修饰符的区别:
1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
PS:__unsafe_unretained修饰符可以被视为iOS SDK 4.3以前版本的__weak的替代品,不过不会被自动置空为nil。所以尽可能不要使用这个修饰符。
注意:在垃圾回收机制里面,如果你同时使用__weak和__block来标识一个变量,那么该block将不会保证它是一直是有效的。 如果你在实现方法的时候使用了block,对象的内存管理规则更微妙:也是(__weak与__block区别:)
1、如果你通过引用来访问一个实例变量,self会被retain
2、如果你通过值来访问一个实例变量,那么变量会被retain
相关文章推荐
- 包装类-Character
- android遇到的问题
- 磁盘高速缓存
- CocoaPods的安装使用和常见问题
- 机房收费系统——测试计划
- UVa147 Dollars
- poj 2955【区间dp】
- Android下编译wifidog
- 用CocoaPods做iOS程序的依赖管理
- 详细讲解安装HUE
- PHP web开发中RSA加密解密简单示例
- 类和对象
- 第九周-项目2 - 对称矩阵压缩存储的实现与应用
- 二叉树中度为0的结点数与度为2的结点数关系论证
- UITableView的cell自适应高度
- WSGI规范细则
- mysql查询今天、昨天、7天、近30天、本月、上一月 数据
- 看看我们以前搞过的几个对象
- Android接口回调机制
- 0 or 1(最短路转化)