block(六)循环引用-b】的更多相关文章

避免Block的循环引用 什么是循环引用,什么时候发生循环引用 1 循环引用就是当self 拥有一个block的时候,在block 又调用self的方法.形成你中有我,我中有你,谁都无法将谁释放的困局. self.myBlock = ^{ [self doSomething]; }; +-----------+ +-----------+ | self | | Block | ---> | | --------> | | | retain 2 | <-------- | retain 1…
在block的循环引用的问题上我们都知道如果在block内部修改外部的变量的时候,要加__block以防止循环引用的问题,但是如果block是当前对象的一个属性的时候,要修改当前对象的一个属性的时候就不能加__block,而是需要再代码块的外部加__weak typeof(self)weakSelf=self;在代码块的内部时候在用点语法进行修改,在非arc环境下要要__weak替换成__block,就可以避免循环引用的问题了.…
1:block的循环引用问题最主要记住两点: 如果[block内部]使用[外部声明的强引用]访问[对象A], 那么[block内部]会自动产生一个[强引用]指向[对象A] 如果[block内部]使用[外部声明的弱引用]访问[对象A], 那么[block内部]会自动产生一个[弱引用]指向[对象A] 2: #import "ViewController.h" #import "XMGPerson.h" @interface ViewController () @prop…
循环引用的原因 众所周知,ARC下用block会产生循环引用的问题,造成泄露的原因是啥呢? 最简单的例子,如下面代码: [self.teacher requestData:^(NSData *data) { self.name = @"case"; }]; 此种情况是最常见的循环引用导致的内存泄露了,在这里,self强引用了teacher, teacher又强引用了一个block,而该block在回调时又调用了self,会导致该block又强引用了self,造成了一个保留环,最终导致s…
什么是循环引用呢? 就是我引用你,你引用我,就会造成循环引用,双方都不会被销毁,导致内存泄漏. _block =  ^{ NSLog(@"%@", self); }; block会对里面强指针变量self强引用一次,造成循环引用. 下面说明一下循环引用是怎么发生的? 1.控制器对象里面有个block属性: 2.block属性指向了一个代码块,就会分配内存,就会有一个block对象: 3.block对象里面有一个外部对象变量self,就会对self强引用,self指针指向的是控制器对象.…
block内部引用外界对象的原则:block会对他内部所有的强指针进行强引用. 验证原理: 在主控制器中modal出ModalVC控制器,ModalVC中有强引用的block属性,在block内部使用self,此时ModalVC便不会被释放,不会执行dealloc方法. 验证代码: 循环引用的情况: #import "ModalVC.h" @interface ModalVC () // block属性 @property (nonatomic, strong) void(^block…
SDWebImage 中有一段源码: #if SD_UIKIT Class UIApplicationClass = NSClassFromString(@"UIApplication"); BOOL hasApplication = UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)]; if (hasApplication &&am…
让我们长话短说.请参阅如下代码: - (IBAction)didTapUploadButton:(id)sender { NSString *clientID = @"YOUR_CLIENT_ID_HERE"; NSString *title = [[self titleTextField] text]; NSString *description = [[self descriptionTextField] text]; [[UIApplication sharedApplicati…
引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题: [小测试]你真的知道blocks在Objective-C中是怎么工作的吗?,发现竟然做错了几道, 才知道自己想当然的理解是错误的,所以抽时间学习了下,并且通过一些测试代码进行测试,产生这篇博客. Block简介(copy一段) Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事.需要注意的是由于Objective-C在iOS中不支持…
自从苹果在objc中添加Block功能支持以后已经过了很久.目前网上对于Block的使用有很多介绍.不过对于Block的内存管理问题,则是众说纷纭.再加上objc开始使用ARC以后,对于Block的内存管理又有了新的变化.因此在本文中笔者将根据自己的理解梳理一下Block的内存管理问题. 1.Block简单原理 首先Block的原理要说起来还是挺简单的,就是将一个函数本身当成参数进行传递.而Block的优势就在于它不止可以访问自己函数作用域内的数据,它也可以访问自己作用域范围外的数据.当然,这也…
Block是一个很好用的东西,这篇文章主要来介绍:1.什么是Block?2.Block的使用?3.Block的循环引用问题及解决. 1.什么是Block? 说这个问题之前,我先来说一下闭包(Closure).闭包就是一个函数,或者一个指向函数的指针,加上这个函数执行的非局部变量.说的通俗一点,就是闭包允许一个函数访问声明该函数运行上下文中的变量,甚至可以访问不同运行上文中的变量. Block实际上就是OC语言对闭包的实现. 下面声明一个Block: int (^Sum)(int, int); 首…
深入研究Block捕获外部变量和__block实现原理 前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理.然而实际使用Block过程中,还是会遇到一些问题,比如Retain Circle的问题. 目录 1.Retain Circle的由来 2.weak.strong的实现原理 3.weakSelf.strongSelf的用途 4.@weakify.@strongify实现原理 一. Retain Circle的由来 循环引用的问题相信大家都很理解了,这里还是…
一.block在OC中的用法可以分为大概一下几种. 1>用于成员属性,保存一段代码,可以替代代理传值. 比如说,创建一个ViewController控制器,点击屏幕就跳转到ModalViewController控制器里的时候,不用代理用block实现一些功能: // 在ModalViewController.h文件里声明: @property (nonatomic, strong) void(^valueBlock)(NSString *data); //在ModalViewController…
不会造成循环引用的block 大部分GCD方法 dispatch_async(dispatch_get_main_queue(), ^{ [self doSomething]; }); 因为self并没有对GCD的block进行持有,没有形成循环引用.目前我还没碰到使用GCD导致循环引用的场景,如果某种场景self对GCD的block进行了持有,则才有可能造成循环引用. block并不是属性值,而是临时变量 - (void)doSomething { [self testWithBlock:^{…
iOS的内存管理机制 Objective-C在iOS中不支持GC(垃圾回收)机制,而是采用的引用计数的方式管理内存. 引用计数:在引用计数中,每一个对象负责维护对象所有引用的计数值.当一个新的引用指向对象时,引用计数器就递增,当去掉一个引用时,引用计数就递减.当引用计数到零时,该对象就将释放占有的资源. 以开灯为例: 图中,“需要照明的人数”即对应我们要说的引用计数值. 第一个人进入办公室,“需要照明的人数”加1,计数值从0变为1,因此需要开灯: 之后每当有人进入办公室,“需要照明的人数”就加1…
在ARC(自动引用技术)前,Objective-c都是手动来分配释放 释放 计数内存,其过程非常复杂. ARC技术推出后,貌似世界和平了很多,但是其实ARC并不等同于Java或者C#中的垃圾回收,ARC计数只是在XCode在编译的时候自动帮我们加上了释放 计数+1 计数-1. 内存泄露例子: 然而在一些特殊的情况下,内存泄露依然存在,而且防不慎防,这里讲一下Objective-C中Block计数是如何产生内存泄露的,如下代码 .h中 typedef void (^CompletionBlock)…
2010年WWDC发布iOS4时Apple对Objective-C进行了一次重要的升级:支持Block.说到底这东西就是闭包,其他高级语音例如Java和C++已有支持,第一次使用Block感觉满简单好用的,但是慢慢也遇到很多坑.本文聊聊ARC和non-ARC下Block使用中的引用循环问题,最近遇到了好几次这种问题,还是深入记录下.先来套题目热热身,貌似能够全部答对的人蛮少的 Block实现原理 首先探究下Block的实现原理,由于Objective-C是C语言的超集,既然OC中的NSObjec…
这篇博文继续block的常见错误——循环引用. 循环引用是很多初学者不能察觉的,其产生的原因,是block中的代码会对对象进行强引用. 读者请阅读示例代码1,并思考示例代码1所创建的对象能否被正常销毁? 示例代码1: //DemoObj.m @interface DemoObj () @property (nonatomic, strong) NSMutableArray *myBlocks; @end #pragma mark 将代码改为调用self的方法 -(NSMutableArray *…
说到循环引用问题,想必大家都碰到过吧,比如在使用Block的时候,使用__weakSelf来代替self解决等,但是对于这个,还是有不少可以探索的点,下面我就来说下,希望对大家有所帮助. 是否所有的Block中,使用self都会导致循环引用? 答案是否定的!如下面所示的这种情况 如上,使用系统自带的UIView的Block,控制器可以被销毁,说明并没有发生循环引用. 原因:UIView调用的是类方法,当前的控制器不可能强引用一个类,所以循环无法形成,动画的block不会造成循环引用 除了系统自带…
造成循环引用的简单理解是:Block的拥有者在Block作用域内部又引用了自己,因此导致了Block的拥有者永远无法释放内存,就出现了循环引用的内存泄漏 示例代码 @interface ObjTest () { NSInteger testValue; } @property (copy, nonatomic) void (^block)(); @end @implement ObjTest - (void)function { /* //这里会循环引用 self.block = ^() { s…
稍有常识的人都知道在 iOS 开发时,我们经常会遇到循环引用的问题,比如两个强指针相互引用,但是这种简单的情况作为稍有经验的开发者都会轻松地查找出来. 但是遇到下面这样的情况,如果只看其实现代码,也很难仅仅凭借肉眼上的观察以及简单的推理就能分析出其中存在的循环引用问题,更何况真实情况往往比这复杂的多: testObject1.object = testObject2; testObject1.secondObject = testObject3; testObject2.object = tes…
循环引用,指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存.其实有点类似死锁. 举个例子:A->B->C->....->X->B   ->表示强引用,这样的B的引用计数就是2,假如A被系统释放了,理论上A会自动减小A所引用的资源,就是B,那么这时候B的引用计数就变成了1,所有B无法被释放,然而A已经被释放了,所有B的内存部分就肯定无法再释放再重新利用这部分内存空间了,导致内存泄漏. 情况一:delegate Delegate是ios中开…
本文由 伯乐在线 - nathanw 翻译,dopcn 校稿.未经许可,禁止转载!英文出处:digitalleaves.com.欢迎加入翻译组. ARC 下的循环引用类似于日本的 B 级恐怖片.当你刚成为苹果开发者,你或许不会关心他们的存在.直到某天你的一个 app 因内存泄露而闪退,你才突然意识到他们的存在,并且发现循环引用像幽灵一样存在于代码的各个角落.年复一年,你开始学会如何处理循环引用,检测和避免它们,但是这部片子的恐怖结局还是在那里,随时可能出现. ARC 令许多开发者(包括我)感到失…
NSTimer常见用法 @interface XXClass : NSObject - (void)start; - (void)stop; @end @implementation XXClass { NSTimer *timer; } - (id)init { return [super init]; } - (void)dealloc { [timer] } - (void)stop { [timer invalidate]; timer = nil; } - (void)start {…
一.BLOCK 循环引用 一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身.构成循环引用. // 定义 block 的时候,会对外部变量做一次 copy,强引用, self自身为强引用. 解决方案如下: #import "ViewController.h" #import "NetworkTools.h" @interface ViewController () @property (nonatomic, stron…
class networkTool: NSObject { //定义一个可选类型的闭包,用小括号()?括起闭包 var finishedCallBack2:((_ jsonData:String)->())? /* 模拟数据请求,定义一个闭包 闭包类型:(参数列表)->(返回值类型) @escaping 逃逸的,在非当前闭包内返回,需要使用@escaping */ func loadData(_ finishedCallBack:@escaping (_ jsonData:String)-&g…
在ARC与非ARC环境下对block使用不当都会引起循环引用问题,一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.theBlock = ^(void){[self dosomething];或者self.otherVar = XXX;或者_otherVar = ...};block的这种循环引用会被编译器捕捉到并及时提醒,那要如何避免呢,我在这里做了个demo测试. 直接看demo #import "ViewControll…
在介绍block循环引用前我们先了解一下typeof. typeof是什么??? typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型. 它返回值是一个字符串,该字符串说明运算数的类型. 一.对于数字类型的操作数而言,typeof返回的值是number.比如说:typeof(1),返回的值就是number. 上面是举的常规数字,对于非常规的数字类型而言,其结果返回的也是number.比如typeof(NaN),NaN在 JavaScript中代表的是特殊非数字值,虽然它本身是一…
在介绍block循环引用前我们先了解一下typeof. typeof是什么??? typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型. 它返回值是一个字符串,该字符串说明运算数的类型. 一.对于数字类型的操作数而言,typeof返回的值是number.比如说:typeof(1),返回的值就是number. 上面是举的常规数字,对于非常规的数字类型而言,其结果返回的也是number.比如typeof(NaN),NaN在 JavaScript中代表的是特殊非数字值,虽然它本身是一…