打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
iOS block里的self
http://m.blog.csdn.net/blog/focusjava/41847989


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 510 // __unsafe_unretained id safeSelf = self; //ios 411 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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
iOS中使用ARC的注意事项
iOS: ARC和非ARC下使用Block属性的问题
OC与Swift闭包对比总结
iOS ARC内存管理总结
【面试】iOS 开发面试题(三)
招人的事结了,放出面试题,分享一下吧 | iOS开发
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服