首先介绍一下垃圾回收机制: 只需要开辟内存空间, 由系统自动回收垃圾内存.
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];
}