Objective-C内存管理

1、什么是内存管理

**  移动设备的内存及其有限,每一个app所能占用的内存也有限的

**  当app所占用的内存较多时,系统会给app发送内存警告,这时,app需要回收一些不再使用到的内存空间,比如回收一些不需要使用的对象。

**  管理范围,任何继承了NSObject的对象,对其他的基本数据类型(int 、char、 float、double、struct、enum等)无效


2、OC对象的基本结构



**  每个OC对象都有自己的引用计数器,是一个整数, 表示对象被引用的次数, 

**  每个OC对象内部专门有4个字节的存储空间来存储引用计数器 


3、引用计数器的作用

**  当调用 alloc 、new 或者 copy 创建一个对象时,新创建对象的引用计数器默认为1

**  当一个对象的的引用计数器的值为0时,对象所占用的那块内存空间就会被系统回收,换句话说,如果对象的引用计数器不为0,那么在程序运动的过程中,这个对象所占用的内存空间都不回被系统回收,除非整个程序退出。


4、引用计数器的操作

**  给对象发送 retain 消息,可以使对象的引用计数器+1,并且返回对象本身

**  给对象发送一条release 消息, 可以使对象的引用计数器-1 ,并不是就释放对象,没有返回值 

** 可以通过给对象发送retainCount消息来获对象当前的引用计数器的值

** 对象被释放的唯一标识是 对象的 retainCount 的值为 0。


新建Person对象

Person.h文件

@interface Person : NSObject

@property int age;

@end

Person.m文件

// 当一个Person对象被回收的时候,就会自动调用这个方法
- (void)dealloc
{
    NSLog(@"Person对象被回收");
    self = nil;
    // super的dealloc一定要调用,而且放在最后面
    [super dealloc];
}


main.m 文件

#import "Person.h"

int main()
{
    // 1
    Person *p = [[Person alloc] init];
    NSLog(@"计数器:%ld", [p retainCount]);
    
    
    // 2 retain方法返回的是对象本身
    [p retain];
    
    // 1
    [p release];
    
    // 0 野指针:指向僵尸对象(不可用内存)的指针
    [p release];
    
//    [p retain]; // 对象释放不能复生, 已经被释放的对象不能在发
    
    //OC不存在空指针错误,给空指针发送消息,不报错
//    p = nil;      // 指针p变成空指针
//    [nil release];
    
    // 野指针错误: EXC_BAD_ACCESS : 访问了一块坏的内存(已经被回收、已经不可用的内存)
    [p release];
    [p release];
    
    
    /* 打开僵尸对象检测开关   */
    // -[Person setAge:]: message sent to deallocated instance 0x100109a10
    // 给已经释放的对象发送了一条-setAge:消息:
    p.age = 10;
    //[p setAge:10];

    
    return 0;
}


5、几个重要的概念

**  将是对象:所占用内存已经被回收的对象,僵尸对象不能再使用

**  野指针:指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS

**  空指针:没有指向任何东西的指针(存储的东西是nilNULL0),给空指针发送消息不会报错


总结:

**   retain :计数器+1,会返回对象本身

**   release :计数器-1,没有返回值

**   retainCount :获取当前的计数器

**  dealloc方法

  * 当一个对象要被回收的时候,就会调用

  * 一定要调用[super dealloc],这句调用要放在最后面










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值