小编给大家分享一下block循环引用问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
成都创新互联公司服务项目包括宁波网站建设、宁波网站制作、宁波网页制作以及宁波网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,宁波网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到宁波省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!从iOS4.0开始,objective C中引入了block技术。block跟标准c的函数类似,block的引入使得代码回调更加方便。
优点:
(1)、回调直接写在需要触发的地方,使代码更具有连续性。
(2)、在代码块内部可以访问局部变量
但是,如果block使用不慎,将引起内存泄露。
1、为啥会引起内存泄露?
在block代码块里,如果传入了代码块外部的对象,block会对该对象进行retain,持有该对象,造成循环引用。
eg:
@interface TestBlockObject : NSObject
- (void)invokeBlock:(void (^)(void))testBlock;
@end
@implementation TestBlockObject
- (void)invokeBlock:(void (^)(void))testBlock{
NSLog(@"TestBlockObject");
}
@end
//调用
@interface ViewController ()
{
TestBlockObject *ob;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
ob = [TestBlockObject new];
[ob invokeBlock:^{
//引起循环引用
[self testPrint];
}];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)testPrint{
NSLog(@"哈哈");
}
@end
引起循环引用的地方
[ob invokeBlock:^{
//引起循环引用
[self testPrint];
}];
ViewController(self)持有ob,ob的block中持有self,导致了循环引用。self对象将不会被销毁,从而ob也不会被销毁,引起内存泄露。
2、解决循环引用方法
使用以下的代码替换红色代码
__weak typeof(self) weakSelf = self;
[ob invokeBlock:^{
if (weakSelf) {
[weakSelf testPrint];
}
}];
通过将self转换成weak对象,然后再block中使用,破坏循环引用。
3、特殊的地方
若在ViewController的viewDidLoad加入下方的代码,是不会导致循环引用的。因为代码块是类方法,ViewController没有持有该部分内存。当block执行结束后,block就会被释放掉,因而self就不会被持有。
[UIView animateWithDuration:0.5 animations:^{
[self testPrint];
}];
以上是“block循环引用问题的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。