OC-retain,copy,assign及autorelease

原创 2015年11月18日 10:23:34
一,retain, copy, assign区别

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

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

3. 上面两点其实就是assign和retain的区别,assign就是直接赋值,从而可能引起1中的问题,当数据为int, float等原生类型时,可以使用assign。retain就如2中所述,使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。

4. copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。

5. atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:

if (property != newValue) {  
    [property release];  
    property = [newValue retain];  
}

二,深入理解一下(包括autorelease)

1. retain之后count加一。alloc之后count就是1,release就会调用dealloc销毁这个对象。
如果 retain,需要release两次。通常在method中把参数赋给成员变量时需要retain。
例如:
ClassA有 setName这个方法:
-(void)setName:(ClassName *) inputName
{
   name = inputName;
   [name retain]; //此处retian,等同于[inputName retain],count等于2
}
调用时:
ClassName *myName = [[ClassName alloc] init];
[classA setName:myName]; //retain count == 2
[myName release]; //retain count==1,在ClassA的dealloc中release name才能真正释放内存。

2. autorelease 更加tricky,而且很容易被它的名字迷惑。我在这里要强调一下:autorelease不是garbage collection,完全不同于Java或者.Net中的GC。
autorelease和作用域没有任何关系!
autorelease 原理:
a.先建立一个autorelease pool
b.对象从这个autorelease pool里面生成。
c.对象生成 之后调用autorelease函数,这个函数的作用仅仅是在autorelease pool中做个标记,让pool记得将来release一下这个对象。
d.程序结束时,pool本身也需要rerlease, 此时pool会把每一个标记为autorelease的对象release一次。如果某个对象此时retain count大于1,这个对象还是没有被销毁。
上面这个例子应该这样写:
ClassName *myName = [[[ClassName alloc] init] autorelease];//标记为autorelease
[classA setName:myName]; //retain count == 2
[myName release]; //retain count==1,注意,在ClassA的dealloc中不能release name,否则release pool时会release这个retain count为0的对象,这是不对的。

记住一点:如果这个对象是你alloc或者new出来的,你就需要调用release。如果使用autorelease,那么仅在发生过retain的时候release一次(让retain count始终为1)。
版权声明:本文为博主原创文章,未经博主允许不得转载。

alloc、retain、copy、new、autorelease的区别

内存管理法则: 1.凡是用alloc,retain,new,copy,mutableCopy或者以copy开头,以mutableCopy开头的方法[创建]的对象,都需要用release或auto...
  • u010165653
  • u010165653
  • 2014年11月11日 18:44
  • 811

autorelease的使用和注意

1.当我们创建一个对象时,(1)Person *p = [[Person alloc] init],就需要在下方执行一次(2)[p release],而[p release]一般放在最后,如果紧跟(1...
  • miaopf123
  • miaopf123
  • 2015年07月08日 23:12
  • 1907

IOS 学习之 —— 内存管理alloc,assign,retain,copy,release,autorelease

IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计数。 alloc 对象分配后引用计数为1 retain 对象的引用计数+1 copy 一个对象变成新的对...
  • u012913404
  • u012913404
  • 2014年12月10日 14:36
  • 596

retain,copy,assign及autorelease

IOS基础:retain,copy,assign及autorelease 一,retain, copy, assign区别 1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a...
  • wobilini
  • wobilini
  • 2013年09月25日 18:03
  • 468

IOS基础:retain,copy,assign及autorelease

一,retain, copy, assign区别 1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了...
  • hanjieson
  • hanjieson
  • 2013年09月24日 14:56
  • 573

retain,copy,assign和autorelease

1.假如你用malloc分配了一块内存,并且把它的地址赋值给了a,后来你希望指针b也共享这块内存,于是你有把a赋值给(assign)了b。此时a和b指向同一内存,请问当a不在需要这块内存时,能否释放这...
  • u012485897
  • u012485897
  • 2017年01月15日 11:38
  • 149

对iOS中内存处理的一些理解(retain,copy,assain,release,autorelease)

众所周知,iOS对内存的处理是很出色的,正因为它对内存的处理优化非常好,所以在有限的内存下系统运行的流畅性一直很不错。这里就对编程中对iOS里的retain,copy,assain,release,a...
  • u013561113
  • u013561113
  • 2014年02月10日 10:15
  • 981

iOS 中strong,weak,copy,assign区别

1:ARC环境下,strong代替retain.weak代替assign 2:weak的作用:在ARC环境下,,所有指向这个对象的weak指针都将被置为nil。这个T特性很有用,相信很多开发者都被指...
  • longshen_csdn
  • longshen_csdn
  • 2015年12月14日 19:24
  • 1008

Objective-C ---- retain/copy/assign/等语义修饰理解

【atomic/nonatomic】 (1)atomic[默认属性]:OC使用的一种线程保护技术,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhon...
  • sinat_30162391
  • sinat_30162391
  • 2016年02月15日 10:27
  • 764

iOS中assign,copy,retain之间的区别以及weak和strong的区别,NSString什么时候用copy,什么时候用strong

@property (nonatomic, assign) NSString *title;  什么是assign,copy,retain之间的区别?  assign: 简单赋值,不更改索...
  • yq7788998
  • yq7788998
  • 2016年05月25日 18:27
  • 698
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OC-retain,copy,assign及autorelease
举报原因:
原因补充:

(最多只允许输入30个字)