解释一:
一、assign属性
当数据类型为int、float等原生类型时,可以使用assign,否则可能导致内存泄露。例如当使用malloc分配了一块内存,并把它的地址赋值给了指针a,后来如果希望指针b也共享这块内存,于是讲a赋值给(assgin)b。这时就用到了assgin,此时a和b指向同一块内存。但是现在问题出现了,当a不再需要这块内存时,能都直接释放呢?肯定是不能的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候引起程序crash掉。
assign,retain,copy三者区别二、retain属性
retain属性就是为了解决上述问题而提出的,使用了引用计数(reference counting),还是上面那个例子,我们给那块内存设一个引用计数,当内存呗分配并且赋值给a时,引用计数是1.当把a赋值给b时引用计数增加到2.这时如果a不再使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1.当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以直接释放掉。此时系统自动调用dealloc函数,内存被回收。(自己想了个:你在小区有一个车位,平时你把自己的车停那,你弟弟这时候也想用你的车位,于是你就retain了一下,把这个车位使用人数名字上又增加了一位(引用计数加一),然后你弟和你都可以共用这一个车位。当你或者你弟弟其中一个人不想用的时候(引用计数减一),不想用的那个人能直接把车位上交给小区管理人员吗(内存释放)?不可以!因为你不用了,另外一个还在用,所以还不能把车位上交给小区管理人员,当你俩都不想用了的话就可以把车位上交给物业了)
assign,retain,copy三者区别三、copy属性
copy是你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。
assign,retain,copy三者区别
网友评论