内存管理-引用计数

引用计数

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方法)

posted @   OYNanaHlb  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示