循环引用 && weak strong

@weakify _weak
 _weak

@weakify(self); // RAC _weak的self_weak_变量

  • 解决循环引用

    • 问题: weakSelf是弱引用,会被释放
_weak typeof(self) weakSelf = self;
self.block = ^{
dispatch_async(dispatch_get_global_queue(0,0),^{
[NSThread sleepForTimeInterval:1];
NSLog(@"%@",weakSelf);
});
return self;
};
  • 循环引用的分类

    • 父子对象关系
class Parent{
var name:String
var child: Child?
init(name: String){
self.name = name
}
}

class Child{
var name: String
weak var parent: Parent!
init(name:String, parent: Parent){
self.name = name
self.parent = parent
}
}    

 

    • 当block和闭包包含在类的成员变量中

> 闭包和block是独立的内存对象,会retain它们所引用的对象
> 有一个类中的block恰好引用这个类的属性或方法,可能产生循环引用

_weak typeof(self) weakSelf = self;
self.block = ^{
[weakSelf description];
};    
    • GCD: dispatch_async

> dispatch_async() 闭包会强引用self,但是实例化的self不会引用闭包。所以self会被释放,循环引用不会产生
> 不能使用weakSelf,对象的生命周期结束早于闭包结束,然后weakSelf会被释放

原文地址:https://www.cnblogs.com/HackHer/p/8151214.html

时间: 2024-10-30 03:58:29

循环引用 && weak strong的相关文章

【IOS学习基础】weak和strong、懒加载、循环引用

一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成引用计数加1:而strong则相当于OC中规定retain,它会造成引用计数加1”. ARC的原理:只要还有一个变量指向对象,对象就会保持在内存中.当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放.这条规则对于实例变量.synthesize属性.局部变量都是适用的 strong指针能够保

iOS之weak和strong、懒加载及循环引用

一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成引用计数加1:而strong则相当于OC中规定retain,它会造成引用计数加1”. ARC的原理:只要还有一个变量指向对象,对象就会保持在内存中.当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放.这条规则对于实例变量.synthesize属性.局部变量都是适用的 strong指针能够保

IOS开发--循环引用问题,普通控件为什么用weak,代理为什么用weak,block内用到外面的东

所有的引用计数系统,都存在循环应用的问题. 例如下面的引用关系对象: a创建并引用到了对象b. 对象b创建并引用到了对象c. 对象c创建并引用到了对象b. 这时候b和c的引用计数分别是2和1.当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放.b不释放,c的引用计数就是1,c也不会被释放.从此,b和c永远留在内存中,造成内存浪费.这种情况,必须打断循环引用,通过其他规则来维护引用关系. 那么普通控件为什么要用weak: 如下图控制器中的Vie

java 谈谈引用(强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference))

简单谈谈引用(摘自java虚拟机第二版 ) 署名:wander   一.四种引用 在JDK 1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference).软引用(Soft Reference).弱引用(Weak Reference).虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减弱. 二.引用介绍及回收时机 1.强引用 >>> 就是指在程序代码之中普遍存在的,类似"Object obj=new Object()&q

iOS Block循环引用

前言 本篇文章精讲iOS开发中使用Block时一定要注意内存管理问题,很容易造成循环引用.本篇文章的目标是帮助大家快速掌握使用block的技巧. 我相信大家都觉得使用block给开发带来了多大的便利,但是有很多开发者对block内存管理掌握得不够好,导致经常出现循环引用的问题.对于新手来说,出现循环引用时,是很难去查找的,因此通过Leaks不一定能检测出来,更重要的还是要靠自己的分析来推断出来. 声景一:Controller之间block传值 现在,我们声明两个控制器类,一个叫ViewContr

block使用小结、在arc中使用block、如何防止循环引用

引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题 : [小测试]你真的知道blocks在Objective-C中是怎么工作的吗?,发现竟然做错了几道, 才知道自己想当然的理解是错误的,所以抽时间学习了下,并且通过一些测试代码进行测试,产生这篇博客. Block简介(copy一段) Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事.需要注意的是由于Objective-C在iOS中不支

objective-c启用ARC时的内存管理 (循环引用)

PDF版下载:http://download.csdn.net/detail/cuibo1123/7443125          在Objective-C中,内存的引用计数一直是一个让人比较头疼的问题.尤其是当引用计数涉及到arc.blocks等等的时候.似乎ARC的出现只是让我们解放了双手,由于底层实现依然依赖引用计数,所以开启ARC后,只有对引用计数机制更加了解,才能避免Cycle Retain.Crash等问题的出现. 但是由于使用ARC可以显著提高编码效率,所以建议尽量启用arc,本文

ios循环引用

一.parent-child相互持有.委托模式[案例]:@interface FTAppCenterMainViewController (){}@property(weak,nonatomic) UITableView* myTableView;@end这里面的myTableView就使用了weak修饰符.@property (nonatomic, weak)  iddelegate;[推荐方法]:child只有parent的对象为weak类型:@property (nonatomic, we

block的学习(block和timer的循环引用问题)

一.什么是回调函数? 回调函数,本质上也是个函数(搁置函数和方法的争议,就当这二者是一回事).由"声明"."实现"."调用"三部分组成. 在上面的例子中,我可以看出,函数amount(其实是Block),的声明和调用在A类中,而实现部分在B类中.也就是说,B类实现了amount函数,但并没有权限调用,最终还是 由A类触发调用.我们称这样的机制为"回调".意思是"虽然函数的实现写在B类中,但是真正的调用还是得由A类来完