内存管理法则:
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];