OC的内存管理方式----MRC & ARC

首先介绍一下垃圾回收机制: 只需要开辟内存空间, 由系统自动回收垃圾内存.


oc中有两种内存管理方式: 1.MRC 2.ARC

一. MRC (Menual Reference Count  : 手动引用计数)

     内存的开辟和释放都有代码控制.


     优点: 对内存的管理更加灵活, 可以在需要释放内存空间的时候及时释放内存.

         对程序员的能力要求较高.

      MRC采用的是引用计数机制.

引用计数机制: 是OC的一种避免野指针异常的管理内存机制.

管理方法为: 每当有一个引用指向对象时, 将引用计数器的值加1. 当某个引用释放时, 引用计数器的值减1. 当引用计数器                     的值为0时, 表示没有引用占用该对象, 则释放该内存空间. 


✨会导致引用计数器的值加1的方法为: alloc, retain, copy


·  alloc: 创建一个对象时, 引用计数器从0 -> 1

·· retain: 增加这个对象的使用者, 引用计数器从1开始每次递增1

···copy: 拷贝一个对象到一个新的对象, 新的对象是一块新的内存空间, 所以被拷贝的对象引用计数的值没有发生变化,              新的对象的引用计数器值从0 -> 1 .copy和alloc和retain的用法有区别, 不能直接用对象调用, 必须是遵循           NSCopying 协议的类的对象才可以调用. 具体方法在后文中介绍.




✨会导致引用计数器的值减1的方法为: release, autorelease

·  release: 释放一个引用占用的内存空间.

··autorelease: 由autoreleasepool控制什么时候释放该内存空间. autoreleasepool大括号结束后按出栈的方式释放内存                        空间(后文再介绍).





ARC(Auto Reference Count  自动引用计数)

iOS5.0的编译器特性. 允许只开辟内存空间, 由编译器自动释放内存空间.


注意:ARC不是垃圾回收机制, ARC本质上是MRC, 只是编译器帮程序员默认加了释放的代码.


copy的相关知识点和使用方法:

比如定义了一个Person类, 该类的对象有person1 , person2.  属性有name和age. 给person1赋值name和age, 想将person1的name和age拷贝到person2中, 则需要:

1.在Person.h中在父类后<NSCopying> 使Person类遵循NSCopying协议

2.在Person.m中写一个-(id)cooyWithZone:(NSZone: )zone 方法的实现 方法中定义一个拷贝后的Person对象, 再将需要拷贝的对象的属性赋值给定义好的Person对象.

代码如下:


-(id)copyWithZone:(NSZone *)zone{

Person *person = [[Person allocWithZone:zone]init];

person.age = self.age;  // 也可以 person.age = self.age + 20;   这样拷贝后的对象的年龄就比被拷贝的对象年龄多20岁

person.name = self.name;

return person;

}



这样Person的对象就可以使用copy拷贝你想拷贝的东西了.


autoreleasepool:  (自动释放缓冲池)

@autoreleasepool{

在大括号中写需要自动释放的的对象的语句

[person1 autorelease];

[person2 autorelease];

[person3 autorelease];


}


缓冲池中出现autorelease时, 就将需要自动释放的对象存放到栈中, 先进栈的对象在栈的最底层. 当运行到缓冲池的大括号结束时, 按栈中的顺序发送release消息给该对象, 释放该对象的内存空间. 释放的顺序是代码区中的倒序, 因为栈的特点是后进先出.


dealloc方法:

当引用计数器的值为0时, 自动调用其父类的dealloc方法, 释放该内存空间. 需要在.h文件中写dealloc方法的实现

代码如下:

-(void)dealloc{

[super dealloc];

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值