本文共 2317 字,大约阅读时间需要 7 分钟。
在还没有ARC机制之前,都是进行手动的内存管理
1:程序都是依托在ios 系统中的,当程序小号系统内存
为40M时,会有一个内存警告;达到45M时,会再有一个内存警告;达到120M时,系统会将程序强行退出,即闪退,引起闪退的另一个因素是逻辑错误。
2:当创建一个对象时,系统会做三件事
》1:分配内存空间,存储对象
》2:初始化成员变量
》3:返回对象的指针地址
3:
》1:对象在完成创建的同时,内部会自动创建一个引用计数器,这个计数器,是系统用来判断是否回收对象的唯一依据,当我们的引用计数器retainCount = 0的时候,系统会毫不犹豫回收当前对象
》2:[对象 release] retainCount - 1
》3:[对象 retain] retainCount +1 ,返回self
》4:我们的引用计数retainCount =0 ,对象就被销毁了
》5:dealloc 函数,当一个对象要被销毁的时候,系统会自动调用dealloc函数,通知对象将要被销毁
4:
》1:创建一个对象 Person *p = [[Person alloc]init];
》2:set方法内存分析,内存泄露主要是因为set方法,需要重写对象的set /get方法,如在.h文件中
-(void)setCar:(Car *)car
{
if(_car != car)
{
//release 旧值
[_car release];
//retain新值
_car = [car retain];
}
}
-(Car *)car
{
return _car;
}
》3:在.h文件中重写dealloc函数
-(void)dealloc
{
//目的是要保证在p对象存在的时候,car对象一定存在。如果一个对象被声明成了成员变量或者是使用@property生成的符合内存管理的set方法,那么一定要在dealloc函数对应一次release操作
[_car release];
//在对象自身被销毁之前,一定要先调用[super dealloc]释放父类中的相关对象
[super dealloc];
NSLog("@Person 被销毁了");
}
5:内存管理原则(配对原则):只要出现了new , alloc, retain ,就一定配对出现一个release,autorelease
手动内存管理主要研究问题
》1:野指针操作 :当我们一个对象的retainCount=0时,保存了这个指针地址的变量再去使用他去操作这个对象的所有方法,将会发生野指针操作
》2:内存泄露:不再被使用的对象,一直在内存中没有被销毁
6:
》1:避免野指针操作的方法:如果你确定当前作用域中的对象已经不会再被使用了,为了防止野指针操作,通常我们会把不再使用的指针变量赋值为nil ,即 p = nil ;
》2:当一个对象retainCount已经为0时,再调用retain方法,是不会使得对象起死回生的,同时还会发生野指针操作异常
7:EXC_BAD_ACCESS 错误,表明访问了不可访问的内存空间。
被系统回收的对象我们称之为僵尸对象,默认情况下xcode为了提高编码效率,不会时时检测僵尸对象。想要打开xcode的时时检测僵尸对象功能,可以 在Edit Scheme -> Run下的Diagnostics下的Enable Zombie Objects 前面方框中打钩。
8:@property Car * car; 做了以下三件事
》1:生成get.set方法的声明
》2:生成get.set 方法的简单实现
》3:如果没有声明相对应的成员变量,那么他会自动生成一个_开头的成员变量,并且是私有的
-(void)setCar:(Car *)car
{
_car=car;
}
-(Car *)car
{
return _car;
}
9:@property 参数分为4类
》1:与set方法内存管理相关参数
retain :要生成符合内存管理原则的set方法(应用于对象类型)
assign:直接赋值(对象类型,基本数据类型(int ,float,double,char))
copy
》2:多线程相关
nonatomic:不生成多线程相关代码,iOS开发使用这个就可以了(效率高一点),实际开发中,只要是对象类型的@proerty就用nonatomic
atomic:生成多线程相关代码(mac 开发 ,不写默认是这种方式)
》3:是否要生成set和get方法
readwrite:可读可写属性,同时生成生成set和get方法
readonly:只读属性,只生成get方法
》4:set与get方法名称相关的参数
setter:设置生成的set方法名称
getter:设置生成的get方法名称
如 @property (nonatomic,assign,setter=abc:,getter = cde)int height;
-(void)setHeight:(int)height;
-(int)height;
调用时
[p abc:50];
NSLog(@"%d",p.height);
(改变set和get方法名称很多都是用在BOOL类型的变量中)
如@property(nonatomic,assign,setter = isDeid:,getter = isDeid) BOOL isDeil;
[p isDeid:YES];
[P isDeid];
p.isDeid = YES;
BOOL result = p.isDeid;
转载地址:http://sxrvb.baihongyu.com/