黑马程序员技术交流社区
标题:
内存管理笔记
[打印本页]
作者:
卫博生
时间:
2015-10-11 22:04
标题:
内存管理笔记
内存管理范围:任何继承了NSObject的对象,对其他基本数据类型无效。
每个OC对象都有自己的引用计数器,用来表示对象被引用的次数。
每个OC对象内部都有4个字节的存储空间用来存储引用计数器。
使用alloc、new或者copy创建新对象的时候,新对象的引用计数器默认值为1
当一个对象的引用计数器的值为0时,对象占用的内存就会被系统回收。
引用计数器的用法
1> retain:计数器+1,会返回对象本身
2> release:计数器-1,没有返回值
3> retainCount:获取对象当前的引用计数器的值
对象销毁
当一个对象的引用计数器的值为0时,该对象将被销毁,其占用的内存被系统回收。
当一个对象被回收时,调用dealloc方法。一般情况下会重写dealloc,来释放相关资源。
重写dealloc方法时,有一定要在最后面调用[super dealloc]。
对象被回收之后,其占用的内存不可再用。
内存管理的简单操作
int main()
{
Person *p = [[Person alloc] init]; // 创建对象,此时引用计数器值为:1
[p retain]; // 对对象p做一次retain操作 引用计数器+1,此时为:2
[p release]; // 对对象p做一次release操作 引用计数器-1,此时为:1
[p release]; // 对对象p做一次release操作 引用计数器-1,此时为:0
// p.name = @"jack"; // 这时p为野指针,p指向的对象为僵尸对象
p = nil; // 将p指针的值清空
return 0;
}
僵尸对象:所占用内存已经被回收的对象,僵尸对象不能使用
野指针:指向僵尸对象的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
空指针:没有指向任何东西的指针(存储的内容是nil、NULL、0),给空指针发送消息不会报错。
多对象之间的内存管理
使用某个对象,则对该对象做一次retain操作。结束使用时,对该对象做一次release操作
谁retain,谁release;谁alloc,谁release。如下:
@class Dog; // 因为Dog类还没有声明,要先告诉编译器Dog是一个类
@interface Person : NSObject
@property(assign,nonatomic) NSString *name;
@property(assign,nonatomic) int age;
// Person对象包含一个Dog对象,当调用Dog对象时,要对dog对象进行一次retain操作
@property(retain,nonatomic) Dog *dog;
@end
@implementation Person
- (void)setDog:(Dog *)dog
{ // 判断dog是否为新dog
if (dog != _dog) {
// 是新dog则对老dog进行一次release操作
[_dog release];
// 对新dog进行一次retain操作
_dog = [dog retain];
}
}
// dealloc重写,用来release Person的Dog
- (void)dealloc
{
// 谁retain谁release,当_dog的值为nil、NULL、0时 对它发送release消息,没有任何意义
[_dog release];
// 重写dealloc要在最后面调用父类的dealloc方法[super dealloc]
[super dealloc];
}
@end
@class:告诉编译器某个名称是一个类的名称,用于.h文件内,在.m中使用improt包含类的所有内容
@property参数
set方法内存管理相关参数
retain:release旧值,retain新值(适用于OC对象类型)
assign:直接赋值(默认、适用于非OC对象类型)
copy:release旧值,copy新值(一般用于NSString *)
set、get方法的生成
readwrite:同时生成set方法和get方法的声明与实现(默认)
readonly:只生成get方法的声明与实现
作者:
gabriel2016
时间:
2015-10-12 12:38
支持一下!
作者:
超の
时间:
2015-10-12 16:05
不错 记下了!
作者:
Abuzzworld
时间:
2015-10-12 17:20
MRC的内存管理确实挺令人头大的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2