oc42--引用计数器

简介:
复制代码
/*  main.m

    堆里面的内存释放是根据引用计数器,所以就是操作引用计数器。
    创建一个对象,对象里面就有一个引用计数器,有多少指针指向它。
    引用计数器为0就释放。任何一个对象初始化时就是1,所以
    {
        Person *p = [[Person alloc] init]
    }
    出了这行代码p销毁了,但是Person对象里面的计数器初始化时就是1,所以计数器不为0,就永远销毁不了。
    给对象发送retain消息引用计数器就会+1,给对象发送release消息引用计数器就会-1。
    retainCount查看对象的引用计数器个数,retainCount获取到的引用计数器个数不准确。
    当一个对象的引用计数器为0时候,会给对象发送dealloc消息,表示对象将会销毁。
 
*/

#import <Foundation/Foundation.h>
#import "Person.h"
/*
 
 ARC: Automatic(自动) Reference(引用) Counting(计数)
 什么是自动引用计数? 
 不需要程序员管理内容, 编译器会在适当的地方自动给我们添加release/retain等代码。
 注意点: OC中的ARC和java中的垃圾回收机制不太一样, java中的垃圾回收是系统干得, 而OC中的ARC是编译器干得。
 
 MRC: Manul(手动) Reference(引用) Counting(计数)
 什么是手动引用计数?
 所有对象的内容都需要我们手动管理, 需要程序员自己编写release/retain等代码。11年12年ios是需要手动释放。
 
 内存管理的原则就是有加就有减
 也就是说, 一次alloc对应一次release, 一次retain对应一次relese
 
 */
int main(int argc, const char * argv[]) {

    @autoreleasepool {
        // 只要创建一个对象默认引用计数器的值就是1
        Person *p = [[Person alloc] init];
        
        NSLog(@"retainCount = %lu", [p retainCount]); // 1,  工程-->Build Settings 把ARC设置YES就不能写这些代码了。
        
        // 只要给对象发送一个retain消息, 对象的引用计数器就会+1
        [p retain];
        
        NSLog(@"retainCount = %lu", [p retainCount]); // 2
        
        [p tt];
        
        // 通过指针变量p,给p指向的对象发送一条release消息
        // 只要对象接收到release消息, 引用计数器就会-1
        // 只要一个对象的引用计数器为0, 系统就会释放对象
        [p release];
        // 需要注意的是: release并不代表销毁\回收对象, 仅仅是计数器-1
        NSLog(@"retainCount = %lu", [p retainCount]); // 1
        
        [p release]; // 0, Person dealloc,调用Person的dealloc方法。
        
        [p tt];
        
        NSLog(@"retainCount = %lu", [p retainCount]);//打印不准确
        NSLog(@"--------");
    }
    //[p setAge:20];   //p已经就释放了
    return 0;
}
复制代码
复制代码
//  Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property int age;

-(void)tt;
@end
复制代码
复制代码
//  Person.m

#import "Person.h"

@implementation Person

- (void)dealloc
{
    NSLog(@"Person dealloc");
    // 注意:super dealloc一定要写到所有代码的最后
    // 一定要写在dealloc方法的最后面,  对象释放时做一些扫尾的工作。 不能手动调用,只能系统调用。
    [super dealloc];
}
-(void)tt{
    NSLog(@"ssssss");
}
@end
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7419047.html,如需转载请自行联系原作者

相关文章
|
存储 弹性计算 运维
阿里云经济型e系列云服务器测评,专为中小应用打造
2023年9月,阿里云推出了一款全新云服务器实例,经济型e实例,基于“飞天+CIPU”黄金技术架构设计,可轻松满足网站建设、开发测试和小型应用构建等场景需求,使用成本最低可降至每天0.5元,告别复杂的选型和高昂的成本,进一步降低了学生群体、个人开发者和小微企业的上云门槛。
2723 0
阿里云经济型e系列云服务器测评,专为中小应用打造
|
语音技术 开发者
ChatTTS:专为对话场景设计的文本转语音模型,底模开源!
最近,开源社区杀出一匹文本转语音领域的黑马——ChatTTS,在Github上仅4天斩获11.2k star。
ChatTTS:专为对话场景设计的文本转语音模型,底模开源!
|
JavaScript 前端开发 API
Vue 2 vs Vue 3: 深入浅出的优势剖析
Vue 2 vs Vue 3: 深入浅出的优势剖析
|
机器学习/深度学习 自然语言处理 数据挖掘
预训练语言模型中Transfomer模型、自监督学习、BERT模型概述(图文解释)
预训练语言模型中Transfomer模型、自监督学习、BERT模型概述(图文解释)
465 0
|
iOS开发
iOS短信验证码控件,自动输入回调两次解决办法
iOS短信验证码控件,自动输入回调两次解决办法
663 0
|
数据采集 机器学习/深度学习 弹性计算
个人使用阿里云服务器能干什么?
个人使用阿里云服务器能干什么?使用阿里云服务器可以做什么?阿里云百科分享使用阿里云服务器常用的十大使用场景,说是十大场景实际上用途有很多,阿里云百科分享常见的云服务器使用场景,如本地搭建ChatGPT、个人网站或博客、运维测试、学习Linux、跑Python、小程序服务器等等,云服务器吧分享使用阿里云服务器可以做的几件小事
1198 0
|
存储 SQL 缓存
DDD之Repository
之前的DDD文章中也指出过,现在从理论角度对于repository是错误,但一直没有摸索出最佳实践,都是当DAO使用,区别在于repository是领域层,也没有深入思考过 最近再次温习《DDD第二弹》时,看到了这个评论
1157 0
DDD之Repository
|
存储 人工智能 NoSQL
阿里云服务器主要用途是干嘛的?对于大学生,可以用它做啥事?
阿里云服务器主要用途是干嘛的?对于大学生,可以用它做啥事?阿里云服务器提供了完善的云计算服务和开发环境,对于大学生来说是一个非常好的学习和实践平台。学习云计算可以提高大学生的实践能力和竞争力,阿里云服务器可以提供实际的实践环境,让大学生可以更加深入地了解云计算的原理和技术,并能够在此基础上进行开发和实践。
|
Java 程序员 网络安全
java版gRPC实战之四:客户端流
客户端流式RPC,适用于客户端提交大量数据到服务端的场景,一起来体验一下
1720 1
java版gRPC实战之四:客户端流
|
编解码 前端开发 机器人
阿里云体验(一)无影云电脑
关于阿里云【无影云电脑】的产品体验。
1475 1