系列:iOS开发-strong 、weak、copy 、assign 、retain

#系列:iOS开发-strong 、weak、copy 、assign 、retaingit

不管是在iOS开发刚学习的时候,仍是在平常的开发中,咱们都须要建立的对象,对应的咱们就会有设置对象的类型的必要. 这个并非说设置了就完事了,为何咱们要用strong 、weak、copy 、assign 、retain等这些不一样的修饰词类定义对象呢? 说白了就是为了内存管理. 内存管理是咱们作开发的所必需要时刻关注的问题. 好在iOS开发通过这么久的发展,已经通过了MRC的时代.如今的ARC时代系统自动管理内存,让咱们省掉了不少事情,可是咱们仍然的要关注,咱们须要在适当的地方使用适当的类型,避免形成没必要要的内存消耗,或者循环引用等问题.github

copy: 用于但愿保持一份传入值的拷贝,而不是值自身的状况,即把原来的对象完整的赋值到另一地方,从新加载一内存区,一个地方变了不影响另外一个地方的对象。 assign: 简单的直接赋值,至关于说两个对象指向同个内存区,一个地方的变了,其余的也跟着改变。 retain:释放旧的对象,将旧对象的值赋予输入对象,再提升输入对象的索引计数 为1 strong 用来修饰强引用的属性;相似于对应原来的retain或者copy weak 用来修饰弱引用的属性;相似于对应原来的assign函数

copy与retain: 一、copy实际上是创建了一个相同的对象,而retain不是; 二、copy是内容拷贝,retain是指针拷贝;
三、copy是内容的拷贝 ,对于像NSString,的确是这样,可是若是copy的是一个NSArray呢?这时只是copy了指向array中相对应元素的指针.这即是所谓的"浅复制". 四、copy的状况:NSString *newPt = [pt copy]; 此时会在堆上从新开辟一段内存存放@"abc" 好比0X1122 内容为@"abc 同时会在栈上为newPt分配空间 好比地址:0Xaacc 内容为0X1122 所以retainCount增长1供newPt来管理0X1122这段内存;学习

assign与retain: 一、assign: 简单赋值,不更改索引计数; 二、assign的状况:NSString *newPt = [pt assing]; 此时newPt和pt彻底相同 地址都是0Xaaaa 内容为0X1111 即newPt只是pt的别名,对任何一个操做就等于对另外一个操做, 所以retainCount不须要增长; 三、assign就是直接赋值; 四、retain使用了引用计数,retain引发引用计数加1, release引发引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收;
五、retain的状况:NSString *newPt = [pt retain]; 此时newPt的地址再也不为0Xaaaa,可能为0Xaabb 可是内容依然为0X1111。 所以newPt 和 pt 均可以管理"abc"所在的内存,所以 retainCount须要增长1 ;.net

assign与weak: 一、assign修饰的是基本数据类型,weak修饰的是对象类型 二、weak比assign多了一个功能就是当属性所指向的对象消失的时候(也就是内存引用计数为0)会自动赋值为nil,这样再向weak修饰的属性发送消息就不会致使野指针操做crash,而assign并不会赋值nil,也就是咱们一般说的野指针 三、在MRC时代,咱们使用代理的时候是使用的assign,ARC的时代咱们更倾向于你使用weak,代理

strong与weak: 一、strong与weak是由ARC新引入的对象变量属性 ARC引入了新的对象的新生命周期限定,即零弱引用。若是零弱引用指向的对象被deallocated的话,零弱引用的对象会被自动设置为nil。 二、一般咱们手动建立一个对象的时候咱们会在vc中建立一个strong类型的对象, 表示当前的vc的类的对象拥有这个小的对象,这样其能够对该对象保持全部权,该对象的修改乃至销毁都由当前的vc来决定,当vc不存在的时候对象也会被释放 三、咱们会在使用xib或者storyboard的时候,拖出来的是一个weak类型的对象,事实上IBOutlet的属性通常能够设为weak是由于它已经被view引用了,除非view被释放,不然IBOutlet的属性也不会被释放,另外IBOutlet属性的生命周期和view应该是一致的,因此IBOutlet属性通常设为weak。 四、在ARC的项目中,咱们绝大部分看到的都是strong和weak修饰数据类型,咱们更少的管理对象的内存释放问题.可是咱们必须注意,好比一个NSTimer对象,一般咱们使用strong,可是咱们若是使用不当,咱们就会形成其没法释放,从而致使vc没法释放的问题,这个你能够查找一些资料看看 五、在使用block的时候咱们也会遇到循环引用致使的没法释放的问题 例如vc中有一个block,在block中直接调用vc中的一个对象.就会形成循环引用. 咱们须要学会使用弱指针 __weak 来解决,后续的博客会单独介绍 六、strong强引用也就是咱们一般所讲的引用,其存亡直接决定了所指对象的存亡。若是不存在指向一个对象的引用,而且此对象再也不显示列表中,则此对象会被从内存中释放。 七、weak弱引用除了不决定对象的存亡外,其余与强引用相同。即便一个对象被持有无数个若引用,只要没有强引用指向他,那麽其仍是会被清除。没办法,仍是 “强哥” 有面子。指针

strong与retain: 一、声明属性时用strong或者retain效果是同样的(貌似更多开发者更倾向于用strong) 二、在声明Block时,使用strong和retain会有大相径庭的效果。strong会等于copy,而retain居然等于assign! 三、定义Block仍是应该用copy由于非ARC下不copy的Block会在栈中,ARC中的Block都会在堆上的。对象

暂时只想到这么多,后续会继续添加blog

Demo地址:github.com/spicyShrimp…索引

系列:iOS开发-前言+大纲 blog.csdn.net/spicyShrimp…

相关文章
相关标签/搜索