内存管理,readwrite,readonly,assign,retain,copy,nonatomic,的作用以及深浅拷贝

来源:互联网 发布:mac如何打人民币符号 编辑:程序博客网 时间:2024/05/17 22:46

1.内存管理机制

当一个实例alloc以后,其引用计数器自动+1,在它引用到其他对象,或者超出作用域的时候,会自动减去1,此情况为ARC的情况,若MRC,需要手动retain和release,或者创建自动释放池来进行内存管理.

2.readwrite,readonly,assign,retain,copy,nonatomic的区别

readwrite:可读可写,默认属性,系统会生成setter和getter方法

readonly:可读,不可写,系统指挥生成getter方法,只可读取,不可赋值改动

assign:仅用在设置变量,是赋值特性,不进行retain操作,一般数据类型用它

retain: 计数器会+1,指针改变后,setter方法会relase对象然后retain新对象,新对象计数器+1,

copy:和retain类似,但是有区别,例如申明一个copy类型的对象A,初始A=B,实际上A产生了一个新的对象,计数器为1,具体见下文copy和retain的区别

nonatomic:非原子性访问,不加同步,多线程的时候可以提高性能,个人理解为因为非原子性,所以系统不用做额外的工作来保证线程安全,所以性能会高.如果是原子性, 所以不加nonatomic 线程则会相对安全.

3.copy和retain的区别

retain在IOS中常用,它只会进行引用计数器加1,后期操作对应release即可,arc则一般不用管计数器的操作,而copy则会创建一个新的对象的指针,会重新产生copy出来对象的引用计数器值.新的对象遵守协议后,在- (id)copyWithZone:(NSZone *)zone方法里,所有属性都相同.简单来说,model2对象copy了model1对象以后,各自本身的引用计数器是分开的,但是各自的属性却是指向相同指针,公用着引用计数器.或许有人会问,那么如果model1对象销毁后,model2还在,那岂不是model1的属性也还在?(model1都没了,它的属性还能在?你tm逗我呢?)

没错!确实就是还在,model2还用着!你model1确实是销毁了,但是它的属性销毁不销毁和它本身没有任何关系,而是和它属性的引用计数器有关系,说白了,因为model2的存在,mode1的属性的计数器在model1销毁的时候,还是不为0的.

从理论上讲例如:moedel2是copy的model1得来,model1销毁之前,你用一个变量接收过一次这个属性(其实你也可以理解为接受的是model2的这个属性),那么,在model1销毁后,你会发现,这个变量是有内存的,说白了,就是model2在用着.

属性为copy的属性,一般需要遵守协议并重写- (id)copyWithZone:(NSZone *)zone

4.深浅复制的区别:潜复制只复制指向对象的指针,而不复制对象本身,深复制则引用对象本身,简单来说,浅复制会根据对象的改变而改变,而深复制则完全重新分配了空间和指针,是两个独立的个体,只是刚开始的时候值相同

0 0
原创粉丝点击