A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xqlyn123 中级黑马   /  2015-11-29 00:28  /  916 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、引用计数(retainCount)

1、内存的申请

alloc和new是Objective-C语言中申请内存的两种常用方式。

当我们向一个类对象发送一个alloc消息的时候,其会向操作系统在堆中申请一块内存用于存放该类的实例对象。然后将该实例对象的引用计数(retainCount)设置为1,最后返回该对象的指针。

alloc和new的区别:一句话,[Person new]即[[Person alloc]new]

2、引用计数(retainCount)

Cocoa框架中,所有继承自NSObject的子类(包括NSObject)对象中都有一个4个字节的存储空间用于存储其retainCount的值。

我们可以通向对象发送retainCount消息来获取该对象的retainCount的值。

3retainrelease

当我们向一个实例对象发送一个retain消息的时候,其引用计数(retainCount)会执行+1操作。

当我们向一个实例对象发送给一个release消息的时候,其引用计数(retainCount)会执行-1操作。

4、内存的释放

在OC中,当我们向一个对象发送release消息是,其先使得该对象的retainCount属性-1,然后在判断该对象的retainCount是否为0。如果为0则在release方法中释放该对象的内存。

    对NSObject对象的retain和release实现的猜想

    @implementation NSObject

    {

        Class isa  OBJC_ISA_AVAILABILITY;

        int retainCount;

    }

    -(instancetype)retain

    {

        self->retainCount++;

        return self;

    }

    -(void)release

    {

        self->retainCount--;

        if (self->retainCount==0) {

            [self dealloc];

            free(self);

        }

    }

    @end

Tip:如果在一个局部作用域中申请了一块内存,但是当该作用域结束时,系统不会自动调用该对象的release方法。

示例:

int main(int argc, const char * argv[]) {

   

    Person* kaka;

    if (YES) {

        kaka = [Person alloc];

        NSLog(@"kaka retainCount = %ld",[kaka retainCount]);

        NSLog(@"end");

    }

    NSLog(@"kaka retainCount = %ld",[kaka retainCount]);

    return 0;

}

代码执行结果:

    2015-11-23 13:31:13.447 Test[4576:53048] 调用了allc

    2015-11-23 13:31:13.448 Test[4576:53048] kaka   retainCount = 1

    2015-11-23 13:31:13.448 Test[4576:53048] end

    2015-11-23 13:31:13.449 Test[4576:53048] kaka retainCount = 1

    Program ended with exit code: 0

    可以看出,该系统并不会自动向该对象发送release消息。

   



点评

新文档中retainCount是8字节的了。 - (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE; typedef unsigned long NSUInteger;  发表于 2015-11-29 08:51

3 个回复

倒序浏览
学习学习
回复 使用道具 举报
感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马