iOS block里的self
2015-09-09 18:25
260 查看
/article/6418478.html?utm_source=tuicool
block是可以捕捉上下文的特殊代码块。
block可以访问定义在block外的变量,当在block中使用时,它就会为其在作用域内的每个标量变量创建一个副本。
如果通过self拥有一个block,然后又在block中改变了实例变量,就会出错。
例如:
这段代码中,self保留了block,同时block又保留了self,会引发循环保留。很危险。
如果未使用ARC,可以使用__block和__unsafe_unretained来复制一个未保留的引用副本。
在arc出现之前,我们可以自由的把CF*对象转成NS*对象,这称为自己桥接。用了arc之后,我们需要指定一个所有权转移修饰符。
目前arc中提供的修饰符有:
1.__bridge
2.__bridge_retained
3.__bridge_transfer
第一个修饰符__bridge是一个普通的转换,表示不需要增加引用计数,不更改所有权。
第二个是在转换C指针类型时,增加引用计数的值。
第三个是把Core Foundation 指针类型转换成obj-c指针,变把引用计数值+1。如用Core Foundation 方法创建一个对象,并且要用arc来管理对象的内存,就可以用这个。
arc移植的常见错误
1.强制转换obj-c指针位C指针(或者反过来转换)
2.在arc中把void*指针强制转成id类型(或者反过来转),如果要转,就必须是用修饰符
例如: id selfPointer = (__bridge void *)self;
3.在结构体或者(union)集合体中是用obj-c对象
4.使用NSAutoreleasePool
iOS block里的self
block是可以捕捉上下文的特殊代码块。block可以访问定义在block外的变量,当在block中使用时,它就会为其在作用域内的每个标量变量创建一个副本。
如果通过self拥有一个block,然后又在block中改变了实例变量,就会出错。
例如:
1 self.block = ^(NSString *aString) 2 { 3 self.aLabel.text = aString; 4 });
这段代码中,self保留了block,同时block又保留了self,会引发循环保留。很危险。
如果未使用ARC,可以使用__block和__unsafe_unretained来复制一个未保留的引用副本。
1 //例如:(无ARC) 2 __block id safeSelf = self; 3 self.block = ^(NSString *aString) 4 { 5 safeSelf.aLabel.text = aString; 6 }); 7 8 //(有ARC) 9 __weak id safeSelf = self; //ios 5 10 // __unsafe_unretained id safeSelf = self; //ios 4 11 self.block = ^(NSString *aString) 12 { 13 safeSelf.aLabel.text = aString; 14 });
在arc出现之前,我们可以自由的把CF*对象转成NS*对象,这称为自己桥接。用了arc之后,我们需要指定一个所有权转移修饰符。
目前arc中提供的修饰符有:
1.__bridge
2.__bridge_retained
3.__bridge_transfer
第一个修饰符__bridge是一个普通的转换,表示不需要增加引用计数,不更改所有权。
第二个是在转换C指针类型时,增加引用计数的值。
第三个是把Core Foundation 指针类型转换成obj-c指针,变把引用计数值+1。如用Core Foundation 方法创建一个对象,并且要用arc来管理对象的内存,就可以用这个。
arc移植的常见错误
1.强制转换obj-c指针位C指针(或者反过来转换)
2.在arc中把void*指针强制转成id类型(或者反过来转),如果要转,就必须是用修饰符
例如: id selfPointer = (__bridge void *)self;
3.在结构体或者(union)集合体中是用obj-c对象
4.使用NSAutoreleasePool
相关文章推荐
- IOS在后台每隔一段时间执行一下
- ios nil、NULL和NSNull 的使用
- iOS框架学习(一)
- iOS9 - ATS
- iOS开发~Cornerstone与Cocopods一起使用的问题
- iOS排错心得
- phoneGap+iOS环境搭建
- iOS地图及定位功能基本实现的详尽描述
- iOS ZBar扫码简单实现
- ios 继承和CateCategory
- iOS学习笔记46——图片异步加载之SDWebImage
- iOS,关于真机tableViewCell上面button响应事件,不同版本崩溃问题解决
- iOS开发注销操作后更改rootViewController的问题
- WP开发 - 与iOS开发的一些区别
- iOS toll-free bridge
- iOS 拨打电话的三种方式总结
- iOS 开发者开发证书和发布证书的区别以及更换的方法
- IOS圆形带边头像
- iOS8新功能——Self Sizing Cells和Dynamic Type
- 常用的几个提高iOS开发效率的开源类库及工具