objective-c内存管理的实现机制,并简述什么时候由你负责释放对象,什么时候不由你释放?

本文介绍了Objective-C中的内存管理机制,包括对象的生成、初始化及销毁等过程。对比.NET的自动垃圾回收,Objective-C需要手动管理内存,同时也介绍了自动释放池的使用及原理。

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

Object-C的内存管理和.NET有些不一样,.NET的内存回收机制是使用GC自动处理回收,而Object-C本质上还是C语言,所以很多时候还是需要手动去管理内存回收。
  1. Object-C生成一个对象
    Engine *en=[[Engine alloc] init];
    [en dealloc];
    Object-C对象生成分配空间在堆上,需要使用指针来指向其引用。前面也说到了,Object-C中得对象其实就是C中的指针。
  2. 对象初始化以及销毁方法
    +(id) alloc; 注意这里的alloc是一个类方法,调用alloc方法之后会在内存中分配一块空间,并且引用计数会设置为1
    +(id) init; 调用init方法表示初始化对象
    -(void) dealloc; 这里注意一下dealloc不是一个类方法,而是一个实例方法。dealloc 方法用于销毁对象,当引用计数为0的时候系统会自动调用dealloc方法销毁对象
    -(void) release; 调用这个方法用于释放对象的引用,引用计数会-1
    -(void) retain ;调用这个方法用于将引用计数+1
    - (NSUInteger)retainCount; 用于获取一个对象当前被多少对象拥有
4. 内存自动回收处理
   上面的处理的确有点太麻烦了,内存管理简直就是噩梦。只要稍微不注意就内存泄露了。现在还有更好的一种方式解决以上问题,那就是autorelease pool(自动释放对象池)。使用自动释放对象池,在某些情况一下可以不用手工去处理对象内存的释放,貌似和.NET中的垃圾回收机制有点类似了,但是我们不要完全的依赖与它,这和自动管理内存还是有一定差距的。
 自动释放对象池
  看到上面的代码,en 并没有显示去调用release方法。而autorelase pool 就是有这样的一个好处。
 
  5. 自动回收原理简介
  要使用自动回收我们必须手工创建自动释放对象池,NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  NSAutoreleasePool内部包含一个数组(NSMutableArray),用来保存声明为autorelease的所有对象。如果一个对象声明为autorelease,系统所做的工作就是把这个对象加入到这个数组中去。当NSAutoreleasePool自身释放的时候,会遍历数组中的所有对象,并且调用release方法。如果对象的retainCount=0 那么系统会释放这些对象,如果retainCount>0,则会内存泄露。
  在某些情况下,NSAutoreleasePool 调用的销毁方法比较迟,这个时候会占用大量的内存,我们也可以使用内嵌的方式,创建多个NSAutorelease的实例,让占用的资源立马释放掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值