内存管理
基本数据类型(int,float,double,char,struct,enum)的数据内存不需要内存管理
1 对象的内存管理
诞生 alloc或new或copy
生存 接收消息和执行操作
交友 借助方法的组合和参数,调用方法
销毁 内存被释放 delloc:相当于被释放内存的临终遗言,每个内存被销毁之前都会调用dealloc方法
2 引用计数
1 Cocoa采用引用计数也叫作保留计数
2 alloc new copy 用这三个方法创建对象时,对象的引用计数器为1
3 retain 给对象发retain消息后,对象的引用计数器加1
4 release 给对象发送release消息后,对象引用计时器减1
5 dealloc 当一个对象的引用计数器变为0而即将被销毁时,oc自动向对象发送一
个dealloc消息,通常在自己的对象中重写dealloc方法
6 retainCount 获取当前对象的引用计数器的值
使用
QYPerson *someone =[[QYPerson alloc] init]; NSLog(@"count>>>%ld",[someone retainCount]); [someone retain]; NSLog(@"count>>>%ld",[someone retainCount]); [someone release]; NSLog(@"count>>>%ld",[someone retainCount]); [someone release]; NSLog(@"count>>>%ld",[someone retainCount]);
3 对象所有权
1 如果一个对象拥有指向其它对象的实例变量,则称该对象拥有这些对象,复合关系,例如:汽车对象car1中的实例变量_tire指向了轮胎类创建的对象tire1,tire1和car1就是复合关系
2 如果一个函数创建了一个对象,则称该函数拥有它创建的对象
4 super dealloc
作用:是把从父类继承过来的成员变量release,这是对继承机制的合理利用,注意
release的顺序是先release本类的成员变量,最后再调用父类的release
5 自动释放
自动释放池是一个存放实体的集合,这些实体可能是对象
6 总结
1 自己生成的对象,自己持有
NSObject *obj1=[NSObject new]; //计数器为1 //copy [obj1 release];
2 不是自己生成的对象,不用关心对象内存的销毁
NSString *str1=[NSString stringWithFormat@"xxxx,%d",112]; //但是可以自己持有
NSString *str2=[NSString stringWithFormat:@"mmm,%d",1122f]; NSArray *arr1=[NSArray arrayWithObject:@"222",@"adf",nil]; NSMutableArray *arr2=[NSMutableArray arrayWithArray:arr1];
3 自己生成的对象不再使用的时候需要release
NSObject *obj3=[NSObject new]; [obj3 release]; //销毁
4 对象销毁之后,对象指针需要置成nil野指针:指针变量指向的内存空间别释放之后,指针变量没有进行初始化,这样的指针就是野指针内存泄露:内存创建完成之后,没有释放销毁,就会造成内存泄露
obj3=nil; //
5 如果是自己编写创造对象的函数(工厂方法),返回的对象不知道什么时候需要被销毁,可以自动释放
7 内存管理的黄金法则
1 谁创建的谁销毁
2 谁retain(例如:setter),谁release(不再使用的时候,更换复合对象,销毁对象本身的时候)
时间: 2024-10-03 03:53:01