黑马程序员技术交流社区

标题: 内存管理笔记 [打印本页]

作者: 卫博生    时间: 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