关于objective-c内存管理的一个疑问?

发布于 2022-08-27 12:42:47 字数 180 浏览 35 评论 0

请输入图片描述

如图示:不是说release调用之后对象内存就被释放了么?那为什么jack对象还能调用say方法[jack say]?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

南冥有猫 2022-09-03 12:42:47

首先,在ARC时代不建议大家还手动管理引用计数

然后说这个问题,在Objective-C中代码直接控制的并不是内存本身,而是内存中这个实例的引用计数。
所以,alloc方法初始化jack后,jack的引用计数是1。调用了release方法,只是把jack这个实例的引用计数减1,变为0。
引用计数为0并不等于实例被销毁,而是标记为“该实例可以被销毁”。
如果你的代码这样写

Person *jack = [[Person alloc] init];
[jack release];
[jack say];
[jack say];
[jack say];
[jack say];
[jack say];
[jack say];
[jack say];

就会发现jack只say了前边一两次,然后就say不出来了。
因为系统回收发现jack可以被回收,并回收这段内存是需要一点点时间的,而在这段时间内jack就say了那么一两下。

凉宸 2022-09-03 12:42:47

say没有访问self,cpp也有类似的内容

我去搜了下,我的回答是错误的必须要更正下:
能够正确打印,关键在于对象的内存还没有抹掉。
objective-c的调用机制跟cpp不一样,我说cpp有类似的内容可能会误导你。
objC的消息发生[obj call],都会调用objc_msgSend,具体查看:深入分析objc_msgSend

煮茶煮酒煮时光 2022-09-03 12:42:47

在arc中的release是没有用的。

南笙 2022-09-03 12:42:47

ARC中retainCount变为0时,它会通知系统这个对象要被回收了,发消息和处理消息是个异步的过程,它需要时间

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文