retain,copy,assign和autorelease

 1.假如你用malloc分配了一块内存,并且把它的地址赋值给了a,后来你希望指针b也共享这块内存,于是你有把a赋值给(assign)了b。此时a和b指向同一内存,请问当a不在需要这块内存时,能否释放这块内存?答案是否定的,因为a并不知道b是否在使用这块内存,如果a释放了,那么b在使用这块内存的时候就会引起程序崩溃

2.了解到1中assign的问题,那么如何解决呢?最简单的方法就是使用引用计数,还是上面的那个例子,我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用计数是1。当把a赋值给b时引用计数增加到2。这时如果a不使用这块内存,它只需要把引用计数减1,表明自己不在拥有这块内存。b不再使用这块内存时也把引用计数减1.当引用计数变为0的时候,代表该内存不在被任何指针所引用,系统可以把塔直接释放掉。

3.assign就是直接赋值,从而引起1的问题,当数据为int float等原声类型时,可以使用assign。对基础数据类型(nSInteger,CGFloat)和c数据类型(int,float,double,char等)

4.etain就如2中所述,使用了引用计数,retain引起引用计数加1,release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。retain是创建了一个指针,引用对象技术加1

5.copy是内容拷贝创建了一个新的对象,copy是在你不希望a和b共享一块内存时会用到。a和b有各自的内存,与旧有的对象引用计数无关,copy减少对象对上下文的依赖。复制内容(深复制),如果调用copy的是数组,则为指针复制(浅复制),仅仅复制子元素的指针。对NSString、block、数组这种类型

6.strong类似于retain,默认情况下,一个指针都会使用_strong属性,表明这是一个强引用只要引用存在,对象就不能销毁

7.weak取代之前的assign,对象销毁之后会自动置为nil,防止野指针,没有strong对象指向weak对象,weak对象就是清理这个weak属性,即使有其他的weak指针指向他,这些weak指针也会被清掉

8.autorelease原理;

1>.先建立一个autorelease pool

2>.对象从这个autorelease pool里面生成

3>.对象生成=之后调用autorelease函数,这个函数的作用仅仅是在autorelease pool中做个标记,让pool记得将来release这个对象

4>.程序结束时,pool本身也需要release,此时pool会把每一个标记为autorelease的对象release一遍。如果某个对象此时retain count大于1,这个对象还是没有被销毁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值