OC-内存管理的所有权链问题

   背景: 最近维护之前的项目,没有注意具体的对象之间的关系,导致了一个bug。 让我了解到对象的所有权链问题。

   需要内存管理的知识:

      众所周知,oc是使用引用计数来管理内存的(当一个对象被持有,他的retain count 就会+1,当他失去一个持有者时,retain count 会-1,若retain count 为0 时,在ARC下就会被销毁);

     1. 如果有一个方法的局部变量指向某个对象时,那么该变量就拥有这个对象。

复制代码
// 假如有一个对象叫 person


/*有一个方法是 谁是jack,在方法内声明一个指针变量jack,将指针指向person对象,那么指针变量jack 就拥有person对象,person 的retain count +1
*/
-(void)whoIsJack:{
   Person *jack = [Person new];
   jack = person;

}
复制代码

  2.当A对象的实例变量指向B对象时,那么A就拥有B。(所有权链的问题就是这条)

  所有权链,和名字一样对象所(持)有者的的链条, 举个例子: A拥有B,B拥有C,C拥有D,D还可以拥有E。 

 当B 指向F(即B不在持有C而是持有F), 且 C没有再被其它对象持有,那么C 没有被持有,retain count 为0,那么其就会被销毁。以此,D和E 也就没有了持有者,就会被销毁。

 

posted @   大发写字的地方  阅读(269)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示