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

内存管理法则:

1.凡是用alloc,retain,new,copy,mutableCopy或者以copy开头,以mutableCopy开头的方法[创建]的对象,都需要用release或autorelease进行释放。

2.谁[创建],谁释放。哪个类创建,哪个类释放。谁写alloc,谁写release。


alloc 是在堆区上申请开辟对像空间



例如:NSString *str1=[NSString alloc]initWithFormat:@"123"];

NSString *str2=[NSString alloc]initWithFormat:@"123"];

那么str1和str2是两个不同的对象指针,它们的计数器都是1




retain 是将对象计数器加1,表示对对象的引用又增加了一个。


例如:NSString *str1=[NSString alloc]initWithFormat:@"123"];

NSString *str2=[str1 retain];

那么str1和str2是两个相同的对象指针,此时它们的对象计数器是2,即释放空间的话,只需要释放str1和str2其中一个,就已经释放NSString对象了。



new 和C++中的方式一样,OC是借鉴了C++的写法。new的作用是,alloc开辟空间后,调用构造函数。

Dog *dog1=[Dog new];

等同于

Dog *dog1=[[Dog alloc]init];



copy是针对NSString,使用copy和重新开辟一个堆区空间,然后将字符串的值复制到相应的堆区内,但返回的字符串对象是不可修改的,即是readonly。


例如:NSString *str1=[NSString alloc]initWithFormat:@"123"];

NSString *str2=[str1 copy];

此时,str1和str2是两个不同的对象指针,各自对象的计数器都是1,但是str2所对应的对象是不能被修改的,(只读)。




mutableCopy 和copy唯一的区别是新的字符串对象是readwrite。其他的都和copy一样。


autorelease

当一个对象调用方法autorelease时,autorelease并不会将计数器减1.而是将当前对象,地址添加到自动释放池中,当池释放,会释放每个元素。



【常规内存管理】

//添加引用,retain,每个指针用完后,各自释放。


【几种特殊情况】Δ

1.成员变量是对象指针,应在析构函数中释放。

2.如果发生指针的转移,应释放旧对象,retain新对象。

3.从数据结构中取出对象地址,如需长期使用,需要retain。



【对象属性的声明】

@property (retain) Dog * dog;

@property (copy) NSString * str;

//字符串使用修饰符copy


Dog * dog = [Dog new];

相当于

Dog * dog = [[Dog alloc] init];


你可能感兴趣的:(alloc、retain、copy、new、autorelease的区别)