内存管理-引用计数
引用计数
oc引用计数
当一个对象的引用计数为0时,其内存就会被销毁
例如在oc的mrc环境中:
person *per = [[person alloc] init]; [per release];
上述的指针per,注意是指针!指针没有引用计数一说,指向的对象[[person alloc] init]
才有
在创建完后,per指向了这个对象,所以这个对象的引用计数为1;
在发送release消息后,person对象的引用计数-1,到达了0,系统就会对其进行销毁,调用delloc方法
retain方法
在oc的mrc环境中需要手动进行retain以进行内存管理
person *per = [[person alloc] init]; person *per1=[[person alloc]init]; [per release]; per = per1;
在上述的代码中,per先进行了release,这个时候当初创建per时创建的person队形引用计数为0,导致了dealloc,但是并不等于per也跟着没有了,他是指针,依旧存在的,可以赋值的
于是在per=per1后,这两者都指向了per1创建的时候创建的person对象,但是没有进行retain操作,所以per和per1的引用计数,都是当初创建per1时的1个强引用,如果对per进行
[per retain]
,那么per和per1指向对象的引用计数就是2,要记住,虽然是用指针进行操作,但是本质上在操作指向的对象。
内存泄漏
所以内存泄漏是和对象的内存有关而不是指针!
c++的拷贝赋值函数
点击查看代码
my_string& my_string::operator=(const my_string& str){//注意内存泄露与自赋值处理
cout << "拷贝赋值=" << endl;
if(this == &str) return *this;//自赋值
delete[] m_data;
m_data = new char[strlen(str.m_data)+1];
strcpy(m_data, str.m_data);
return *this;
}
为什么要进行delete[] m_data?
其实是为了不让内存泄漏,也就是原本m_data指向的那个内存无人监管,泄漏了,在对m_data的指向进行更改前进行删除,让其重新成为系统可分配的内存
oc的set方法
oc的set方法中包含了retain方法和release方法(另外,在协议中声明的属性不会自动生成set和get方法)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性