iOS的内存管理

本文详细介绍iOS开发中手动内存管理的基本概念、对象创建过程、内存管理原则及常见问题解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在还没有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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值