快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

block循环引用问题的示例分析-创新互联

小编给大家分享一下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许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章名称:block循环引用问题的示例分析-创新互联
文章起源:http://6mz.cn/article/ceihjo.html

其他资讯