关于block中使用weakSelf和strongSelf的问题

有时候我们会碰到这种情况,

__weak typeof(self) weakSelf = self;

[obj block:^(){

  __strong typeof(weakSelf)strongSelf = weakSelf;

}];

我们都知道第一句是为了解决block的循环引用问题,那么在block中的语句是干什么用的呢?

网上查阅资料知道:

在block中调用self会引起循环引用,但是在block中需要对weakSelf进行 strong,保证代码在执行到block中,self不会被释放,当block执行完后, 会自动释放该strongSelf;

因为仅仅使用__weak去修饰变量,当别处把变量释放后,block中该变量也会被释放掉。

时间: 2024-11-03 21:36:23

关于block中使用weakSelf和strongSelf的问题的相关文章

到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf

到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf Objective C 的 Block 是一个很实用的语法,特别是与GCD结合使用,可以很方便地实现并发.异步任务.但是,如果使用不当,Block 也会引起一些循环引用问题(retain cycle)—— Block 会 retain ‘self’,而 ‘self‘ 又 retain 了 Block.因为在 ObjC 中,直接调用一个实例变量,会被编译器处理成 ‘self->theVar’,’self’ 是一个

block 中使用 weakSelf

在实际开发中,很多时候都在 block 中使用 weakSelf.那么什么时候需要使用 weakSelf,什么时候又不需要使用呢? 答案:当 block 不再被 self 持有,被其他对象所持有的时候,就不需要使用 weakSelf,举个例子,我们使用 UIView 的动画的时候,也就是 animateWithDuration的时候,就并不需要使用 weakSelf,因为他们的持有关系是,1.UIView 中某个负责动画的对象持有了 self 2.block 持有了 self,而不是 self

weakSelf 运用 strongSelf来解决block的循环引用

SDWebImage 中有一段源码: #if SD_UIKIT Class UIApplicationClass = NSClassFromString(@"UIApplication"); BOOL hasApplication = UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)]; if (hasApplication &&am

block里的self、weakSelf、strongSelf

转自  http://www.cnblogs.com/zhang-chi/p/5532272.html ARC下,关于block里面使用self.weakSelf.strongSelf,理解一直没有特别的透彻,今天花时间研究了一下,总结如下: 其实一共就涉及到两个问题: 1.是否循环引用了 2.block里面的代码,不一定执行到哪行时,VC可能就释放了,self就为nil了,那么你到底想让代码在这种情况下如何执行. 其实到底用self.weakSelf还是strongSelf,就是上面两个问题的

深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用(上)

深入研究Block捕获外部变量和__block实现原理 前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理.然而实际使用Block过程中,还是会遇到一些问题,比如Retain Circle的问题. 目录 1.Retain Circle的由来 2.weak.strong的实现原理 3.weakSelf.strongSelf的用途 [email protected].@strongify实现原理 一. Retain Circle的由来 循环引用的问题相信大家都很理

深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用(下)

深入研究Block捕获外部变量和__block实现原理 EOCNetworkFetcher.h typedef void (^EOCNetworkFetcherCompletionHandler)(NSData *data); @interface EOCNetworkFetcher : NSObject @property (nonatomic, strong, readonly) NSURL *url; - (id)initWithURL:(NSURL *)url; - (void)star

iOS 面试题(二):什么时候在 block 中不需要使用 weakSelf --转自唐巧

问题 我们知道,在使用 block 的时候,为了避免产生循环引用,通常需要使用 weakSelf 与 strongSelf,写下面这样的代码: __weak typeof(self) weakSelf = self; [self doSomeBlockJob:^{ __strong typeof(weakSelf) strongSelf = weakSelf; if (strongSelf) { ... } }]; 那么请问:什么时候在 block 里面用 self,不需要使用 weak sel

关于block 中 何时使用 __weak/__block MyViewController * weakSelf 分析

说到block .想听我废话下它的基础. block 是一个闭包函数.所谓闭包就是 引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外. oc 中 block 默认创建后 分配在栈中..当向其 发送 copy 消息后 被移到堆上. 防止被释放. 由上面定义可以看出  block 会 保留在它所引用到的 一切变量. __block 参数是什么? 修饰变量时 做了什么? 它是一个存储类型. block 中体现为 不会保留 这样的变量. 同时 你可以在b

彻底分析block中的循环引用

我做了一个被push到的controller,pop的时候,controller会释放,解析详见注释,欢迎批评指正! #import "AnimaViewController.h" @interface AnimaViewController () @property (nonatomic, strong) UIView *view1; @property (nonatomic, strong) UIView *view2; @property (nonatomic, copy) vo